Quicksort实现错误

时间:2013-08-07 18:14:09

标签: c++ algorithm quicksort divide-and-conquer

我正在尝试实施快速排序。但控制似乎永远不会退出快速排序功能。任何帮助将不胜感激。

一些指示:

  1. 我使用第一个元素作为支点。我知道存在更好和更有效的技术来选择枢轴,但这不是那个。
  2. 2.分区函数中的'k'变量是pivot元素。

    据我所知,问题在于分区功能,因为我已经尝试过多次调试。

    此外,这不是一个家庭作业问题。在我自己学习算法后,我试图实现该算法。

    #include<iostream>
    using namespace std;
    
    void swap(int *a,int *b)
    {
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
    }
    
    void readarray( int a[],int n)
    {
        cout<<"Enter elements for the array\n";
        for(int i=0;i<n;i++)
            cin>>a[i];
    }
    
    void printarray(int a[],int n)
    {
        cout<<"Elements are as follows\n";
        for(int i=0;i<n;i++)
            cout<<a[i]<<" ";
    
        cout<<endl;
    }
    
    
    int partition(int low,int high,int a[])
    {
        int i,j,k;
        i=low;
        j=high;
        k=low;
    
        while(i<=j)
        {
            while(a[i]<a[k])
                i++;
    
            while(a[j]>=a[k])
                j--;
    
    
            if(i<=j)
            {
                swap(a[i],a[j]);
                i++;
                j--;
            }
        }
    
        if(i>j)
            swap(a[k],a[j]);
    
        return j;
    }
    
    void quicksort(int low,int high,int a[])
    {
        int k;
        if(low<high)
        {
            k=partition(low,high,a);
            quicksort(low,k-1,a);
            quicksort(k+1,high,a);
        }
    }
    
    int main()
    {
        int a[20];
        int n;
        cout<<"Enter the size of the array\n";
        cin>>n;
        readarray(a,n);
        cout<<"Before sorting\n";
        printarray(a,n);
    
        quicksort(0,n,a);
    
        cout<<"After sorting contents are\n";
    
        printarray(a,n);
    
        return 0;
    }
    

    在主要功能中,我尝试过使用快速排序(0,n,a)和快速排序(0,n-1,a)。两者都没有。

1 个答案:

答案 0 :(得分:2)

您的分区例程存在问题,请参阅注释:

int partition( int low, int high,int a[]) {
   int i, j, k;
   i = low; 
   j = high;
   k = low;

  while ( i < j )
 {
  while( a[i] <= a[k] ) // Move i while item < kth element
   i++;
  while( a[j] > a[k] ) // Move j while item > kth element
   j--;
  if ( i < j )
   swap(&a[i],&a[j]); //Pass address of elements
 }

swap(&a[low],&a[j]); // j is final position for the kth element (viz.the pivot )

   return j;
}

使用以下方法调用快速排序例程:

quicksort(0,n-1,a);