在实现QuickSort时无法对Array进行排序

时间:2016-06-27 05:15:50

标签: c quicksort

我已经在分区集中使用了两种不同的方法实现了快速排序

这些是程序

  

1。http://ideone.com/fPtQFT

     

2。http://ideone.com/KuXKr4

1

int partition(int *a,int l,int r)
{
    int i=l,pivot=l;
    int j=l+1;
    for(;j<r;j++)
    {
      if(a[j]<a[pivot])
      {
        swap(&a[i+1],&a[j]);
        i++;
      }
    }
    swap(&a[pivot],&a[i]);
    return i;
  }

2

 int partition(int *a,int l,int r)

 {
    int pivot=l;
   int j=r-1;
   int i=l+1;
    while(1)
   {
     while(i<=j&&a[i]<=a[pivot])
        i++;
     while(i<=j&&a[j]>=a[pivot])
        j--;
     if(j<i)
        break;
     else
        swap(&a[i],&a[j]);

   }
   swap(&a[pivot],&a[j]);

   return j;

 }

我无法弄清楚我的代码中的错误是排序输出,例如测试用例 13 2 43 3 55 21 43 1 5 32 是错误的1 2 3 13 21 32 42 5 43 55

帮助弄清楚分区集逻辑中的错误

3 个答案:

答案 0 :(得分:2)

quicksort函数采用m到n形式的范围,其中m是第一个元素,n是最后一个元素之后的一个元素。这在主要方面正确完成:

quicksort(a,0,N);

这意味着第二个参数表示第一个元素:0,第三个参数表示超过最后一个元素的一个:N

这在第一次递归调用中没有正确完成,其中跳过最后一个元素,因为p-1表示最后一个元素,而不是最后一个元素之后的一个:

quicksort(a,l,p-1);

答案 1 :(得分:-1)

使用此代码使用快速排序Quick sort

对数组进行排序
QuickSort(A, P , R)
    {
        if(P < R)
        {
            Q = partition(A, P , R);
            QuickSort(A, P, Q - 1);
            QuickSort(A, Q + 1, R);
        }
    }

    int partition(A, P , R)
    {
        while(1)
        {
            key = A[P];
            i = P;
            j = R;
            while(key > A[i] && key != A[i])
                i++;
        while(key < A[j] && key != A[j])
            j--;
        if(i < j)
        swap(A[i],A[j]); 
    else
        return j;
        }
    }

答案 2 :(得分:-1)

这应该这样做:

#include <stdio.h>
#define N 10

void swap(int *a,int*b)
{
    int temp=*b;
    *b=*a;
    *a=temp;
}

int partition(int *a,int l,int r)
{
    int i=l,pivot=a[r];
    int j=l;
    for(;j<r;j++)
    {
      if(a[j]<pivot)
      {
        swap(&a[i],&a[j]);
        i++;
      }
    }
    swap(&a[i],&a[r]);
    return i;
  }


void quicksort(int *a,int l,int r){
    int p;
    if(l<r)
    {
        p=partition(a,l,r);
        quicksort(a,l,p-1);
        quicksort(a,p+1,r);
    }
}


int main(){
    int a[N] = {13, 2, 43, 3, 55,  21, 43, 1, 5, 32};
    int i;
    quicksort(a,0,N);
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
    return 0;
}