出于某种原因,每当我尝试编译程序时,它都说“文件已停止工作”。它没有给出任何具体错误,所以我不知道出了什么问题。我看了很多次,找不到任何错误。
这是快速排序算法的实现。
int partition(int arr[], int left, int right) {
int pivotPos = left + rand() % right;
int pivot = arr[pivotPos];
int p = left;
swap(arr[pivotPos], arr[right]);
for (int i = left; i < right; i++) {
if (arr[i] <= pivot) {
swap(arr[i], arr[p]);
p++;
}
}
swap(arr[p], arr[pivotPos]);
return p;
}
void quickSort(int arr[], int left, int right) {
if (left < right) {
int partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, right);
}
}
int main() {
int theArr[10000];
clock_t d1, d2;
for (int i = 0; i < 10000; i++) {
theArr[i] = 1 + rand() % 500;
}
for (int i = 0; i < 10; i++) {
d1 = clock();
quickSort(theArr, 0, 10000);
d2 = clock();
cout << "Time: " << ((double) (d2 - d1) / (CLOCKS_PER_SEC)) << endl;
}
return 0;
}
答案 0 :(得分:0)
正如hvd在评论部分指出的那样,以下行显示错误。
int pivotPos = left + rand() % right;
您正在寻找的是:
int pivotPos = left + rand() % (right-left);
答案 1 :(得分:0)
我不明白你为什么要在循环结束后交换arr[p]
和arr[pivotPos]
。
pivotPos
是数据透视的初始位置。枢轴的最终位置为p-1
。在循环结束时,阵列已根据需要进行排列。这种交换只会使阵列更加偶然。因此,除了替换
int pivotPos = left + rand() % right;
通过
int pivotPos = left + rand() % (right - left);
取代
arr[right]
的 arr[right-1]
您还应该替换
swap(arr[p], arr[pivotPos]);
return p;
通过
return p-1;
并且,因为函数quickSort
的第三个参数是<maximum index> + 1
,所以递归调用
quickSort(arr, left, partitionIndex - 1);
应替换为
quickSort(arr, left, partitionIndex);