为什么我的quicksort不能对大于35000的阵列停止工作

为什么我的quicksort不能对大于35000的阵列停止工作

这是我做得不好的实现:

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/

10-09 03:39