在C中快速排序

时间:2012-03-04 21:04:37

标签: c

我试图对我的项目使用快速排序,但它不起作用。我无法弄清楚bug的位置。有谁可以帮我搞清楚吗?谢谢。

void quicksort(int arr[],int a, int b){
    if(a<=b){
        int key=arr[a];
        int index=a;
        int i=a, j=b;
        while(i<=j){
            for(;arr[j]>key;--j);
            int temp=arr[j];
            arr[j]=key;
            arr[index]=temp;
            index=j;
            for(;arr[i]<key;++i);
            temp=arr[i];
            arr[i]=key;
            arr[index]=temp;
            index=i;
            }
        quicksort(arr,a,index);
        quicksort(arr,index,b);
        }
    else return;
} 

3 个答案:

答案 0 :(得分:5)

你的内循环是这样的:

  • 从数组的右侧检查,找到应位于key左侧的元素。
  • 将所有找到的元素与位于key的{​​{1}}交换,并将index更新为index的新位置
  • 从数组的左侧检查,找到应位于key右侧的元素。
  • 将所有找到的元素与位于key的{​​{1}}交换,并将key更新为index的新位置

为什么世界上你想要这样做?你应该这样做:

  • 从数组的右侧检查,找到应位于index左侧的元素。
  • 从数组的左侧检查,找到应位于key右侧的元素。
  • 如果找到,请交换它们。如果没有,请将枢轴置于正确位置并退出循环

我不是百分百肯定,但我认为在你的快速排序版本中改变key可能是你问题的罪魁祸首。找出答案的最佳方法是逐步调试代码,看看它出错的地方。

以下是根据我的建议实施的实施,以及一些测试用例:

key

答案 1 :(得分:2)

C已经附带快速排序的qsort功能。

答案 2 :(得分:1)

为什么呢?

arr[j]=key;

因为你应该只在枢轴位置放置一次枢轴

并致电

    quicksort(arr,a,index);
    quicksort(arr,index,b);

也有气味,因为你有相同的低和高指数。

从谷歌查看关于qucksort的精彩视频(包括大量代码和说明)

https://www.youtube.com/watch?v=aMnn0Jq0J-E