如何修复Sort()?
我试图在数组及其Hoare快速排序上实现堆栈,但是由于某种原因,它行不通。在行上抛出异常mid = arr [(左 +右) / 2]; N_OP += 4;
。如何解决此错误?实施中是否有任何错误? (N_OP-操作计数器)
#include <ctime>
#include <iostream>
#include <windows.h>
const int MAX_SIZE = 3000;
using namespace std;
template <typename T>
class Stack
{
public:
T* arr;
int size;
unsigned long long int N_op;
Stack()
{
arr = new T[MAX_SIZE];
size = 0;
}
void Push(int x)
{
arr[size++] = x;
N_op += 5;
}
void Pop()
{
size--;
N_op += 2;
}
T Top()
{
N_op += 3;
return arr[size - 1];
}
T Size()
{
N_op++;
return size;
}
void Sort(int N)
{
int mid, left, right, l, r;
mid = left = right = l = r = 0; N_op += 6;
Push(N - 1); N_op += 2;
Push(0); N_op++;
do {
left = Top(); N_op += 2;
Pop(); N_op++;
right = Top(); N_op += 2;
Pop(); N_op++;
{
mid = arr[(left + right) / 2]; N_op += 4;
l = left; N_op++;
r = right; N_op++;
while (l < r)
{
N_op++;
while (arr[l] < mid)
{
l++;
N_op += 4;
}
while (mid < arr[r])
{
r--;
N_op += 4;
}
if (l <= r)
{
swap(arr[l], arr[r]);
l++;
r--;
N_op += 9;
}
}
}
if (left < r)
{
Push(r);
Push(left);
N_op += 3;
}
if (l < right)
{
Push(right);
Push(l);
N_op += 3;
}
}
while (Size() != -1);
}
};
int main()
{
setlocale(LC_ALL, "Rus");
srand(time(NULL));
int i, t_s, t_f;
int Key[3000];
int N = 300;
Stack<int> stack;
for (i = 0; i < 3000; i++)
Key[i] = rand() % 999;
for (i = 0; i < 10; i++)
{
for (int z = N - 300; z < N; z++)
stack.Push(Key[z]);
stack.N_op = 0;
t_s = GetTickCount64();
stack.Sort(N);
t_f = GetTickCount64();
cout << "Номер сортировки: " << i + 1 << " | Количество отсортированных элементов: " << N << " | Время сортировки (ms): " << t_f - t_s << " | Количество операций (N_op): " << stack.N_op << endl;
N += 300;
}
}
I tried to implement a stack on an array and its Hoare quick sort, but for some reason it doesn't work. Throws an exception on the line mid = arr[(left + right) / 2]; N_op += 4;
. How to fix this error? And are there any errors in the implementation? (N_op - operation counter)
#include <ctime>
#include <iostream>
#include <windows.h>
const int MAX_SIZE = 3000;
using namespace std;
template <typename T>
class Stack
{
public:
T* arr;
int size;
unsigned long long int N_op;
Stack()
{
arr = new T[MAX_SIZE];
size = 0;
}
void Push(int x)
{
arr[size++] = x;
N_op += 5;
}
void Pop()
{
size--;
N_op += 2;
}
T Top()
{
N_op += 3;
return arr[size - 1];
}
T Size()
{
N_op++;
return size;
}
void Sort(int N)
{
int mid, left, right, l, r;
mid = left = right = l = r = 0; N_op += 6;
Push(N - 1); N_op += 2;
Push(0); N_op++;
do {
left = Top(); N_op += 2;
Pop(); N_op++;
right = Top(); N_op += 2;
Pop(); N_op++;
{
mid = arr[(left + right) / 2]; N_op += 4;
l = left; N_op++;
r = right; N_op++;
while (l < r)
{
N_op++;
while (arr[l] < mid)
{
l++;
N_op += 4;
}
while (mid < arr[r])
{
r--;
N_op += 4;
}
if (l <= r)
{
swap(arr[l], arr[r]);
l++;
r--;
N_op += 9;
}
}
}
if (left < r)
{
Push(r);
Push(left);
N_op += 3;
}
if (l < right)
{
Push(right);
Push(l);
N_op += 3;
}
}
while (Size() != -1);
}
};
int main()
{
setlocale(LC_ALL, "Rus");
srand(time(NULL));
int i, t_s, t_f;
int Key[3000];
int N = 300;
Stack<int> stack;
for (i = 0; i < 3000; i++)
Key[i] = rand() % 999;
for (i = 0; i < 10; i++)
{
for (int z = N - 300; z < N; z++)
stack.Push(Key[z]);
stack.N_op = 0;
t_s = GetTickCount64();
stack.Sort(N);
t_f = GetTickCount64();
cout << "Номер сортировки: " << i + 1 << " | Количество отсортированных элементов: " << N << " | Время сортировки (ms): " << t_f - t_s << " | Количество операций (N_op): " << stack.N_op << endl;
N += 300;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论