我已经在分区集中使用了两种不同的方法实现了快速排序
这些是程序
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
帮助弄清楚分区集逻辑中的错误
答案 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;
}