需要了解这种快速排序

时间:2014-03-01 22:01:20

标签: data-structures quicksort

我很难理解快速排序。这是我到目前为止的理解

  1. 我们选择一个支点
  2. 小于枢轴的所有元素都位于数据透视表的左侧
  3. 除了枢轴之外的所有元素都在右侧
  4. 使用递归继续此过程
  5. 现在我的问题是我不明白如何继续最后一步是递归。到目前为止,我有以下内容。我只想要一个非常基本的。该数组不会有重复

    void quickSort(int *ptr,int lowindex , int highindex)
    {
        int left = lowindex ;
        int right = highindex;
        int pivot = ptr[rand()%highindex];
    
        while(left < right)
        {
            while(ptr[left] < pivot)
            {
                left++;
            }
            while(ptr[right] > pivot)
            {
                right--;
            }
    
            //Now swap the two
            int temp = ptr[left];
            ptr[left] = ptr[right];
            ptr[right] = temp;
        }
    
        std::cout << "Current Array is :  ";
        for(int i=0;i<7;i++)
         {
             std::cout << ptr[i] << ","  ;
         }
        std::cout << "\n";
    
            //How to add  recursion ?
    }
    

    while(left < right)循环也有可能被卡住 - 即左右不变,所以它继续循环?如果是这样我该如何处理呢?

1 个答案:

答案 0 :(得分:0)

这一行

int pivot = ptr[rand()%highindex];

应该是

int pivot = ptr[lowindex+rand()%(highindex-lowindex+1)];

假设有效范围介于lowindexhighindex之间。但即便这样你也会遇到一个问题,即你不知道枢轴是属于左边还是右边的部分,更容易从固定位置挑选它,比如pivot=ptr[lowindex]

你的一个比较操作应该包括相等,比如

  while( ptr[left] <= pivot )

最后,你会发现枢轴之外的left指针,以及right指针的右侧。在这种情况下,您不能进行交换操作。

    if( left < right ){ // swap

分区后,您需要确保枢轴值在两个部分之间结束

swap( ptr[lowindex /*pivot*/], ptr[right] );

最后,对于递归,您可以在函数末尾添加如下内容:

quickSort( ptr, lowindex, right-1 );
quickSort( ptr, left, highindex );

虽然一般概念看起来相当简单,但细节有点难以实现。做好一些调试准备。希望这会有所帮助。