这是我做得不好的实现:
void partition(people * arr, int size){
if(size <= 1)
return;
people pivot = arr[rand() % size];
int low = 0;
int high = size - 1;
while(low < high){
while( (arr[low].lname < pivot.lname) || ( (arr[low].fname < pivot.fname) && (arr[low].lname == pivot.lname) ) ||
( (arr[low].fname == pivot.fname) && (arr[low].lname == pivot.lname) && (arr[low].dob < pivot.dob) ) )
low += 1;
while(arr[high].lname > pivot.lname || ((arr[high].fname > pivot.fname)&&(arr[high].lname == pivot.lname)) ||
( (arr[high].fname == pivot.fname)&& (arr[high].lname == pivot.lname) && (arr[high].dob > pivot.dob) ) )
high -= 1;
people temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
partition(arr, low);
partition(&(arr[low+1]), size - low - 1);
}
void kwiksort(people * arr, int size)
{ srand((unsigned int)time(0));
partition(arr,size);
}
该程序的行为就像是在无限循环中一样,并且实际上冻结了。
另外,如果有人可以指出一些优化快速排序的方法,那将是很好的。
最佳答案
您的版本存在一些问题:
1)如果两个值都等于数据透视表,则两个循环都不会触发(一个应该)
2)交换之后,您不会上下波动(可以放弃重新测试)
如果仅修复其中之一,您的代码将起作用
关于c++ - 为什么我的quicksort不能对大于35000的阵列停止工作? (C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27346981/