0

我试图实现快速排序。但是控件似乎永远不会退出快速排序功能。任何帮助将非常感激。

几点建议:

  1. 我使用第一个元素作为枢轴。我知道存在更好、更有效的技术来选择支点,但这不是关于那个。

2.分区函数中的'k'变量是枢轴元素。

据我所知,问题出在分区函数上,因为我已经尝试过多次调试它。

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

#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)。都没有奏效。

4

1 回答 1

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);

于 2013-08-07T19:04:06.077 回答