下面的快速排序代码给出的结果不正确。有人能说出什么问题吗?
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
int b[MAX];
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
}
int party(int a[],int p,int q)
{
int pivot=a[p];
int t=a[p];
a[p]=a[q];
a[q]=t;
int i,j,k,store=p;
for(i=p;i<=q-1;i++)
{
if(a[i]<=pivot)
{
t = a[i];
a[i] = a[store];
a[store] = t;store++;}
}
t = a[store];
a[store] = a[q];
a[q] = a[store];
return store;
}
void quicksort(int a[],int p,int q)
{
if(p>=q)
{
return;
}
int r=party(a,p,q);
quicksort(a,p,r-1);
quicksort(a,r+1,q);
}
int main()
{
printf("Enter No. oF elements for sorting.\n");
int i,j,k,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Element %d\t",i+1); scanf("%d",&b[i]);
}
print(b,n);
quicksort(b,0,n-1);
print(b,n);
return 0;
}
编辑:只花了几分钟做了一些基本的缩进,而不是要求作者去做。我本可以输入正确的变量名称,但因为答案感觉很好。
答案 0 :(得分:2)
埋藏在你可能喜欢的那种可怕的代码格式中是这样的:
t=a[store];a[store]=a[q];a[q]=a[store];
理智的人看起来像这样:
t=a[store];
a[store]=a[q];
a[q]=a[store];
您将a[q]
设置为与原来相同的值,而不是交换任何内容。它应该是:
t=a[store];
a[store]=a[q];
a[q]=t;
顺便说一句,你不需要低索引和高索引,你只需要一个基本数组地址和这个算法的长度(当然还有一点指针数学):
static void swap_int(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
void quicksort(int a[], int len)
{
int i=0, pvt=0;
if (len <=1)
return;
for (;i<len;++i)
{
if (a[i] < a[len-1])
swap_int(a+i,a+pvt++);
}
swap_int(a+pvt,a+len-1);
quicksort(a, pvt++);
quicksort(a+pvt, len-pvt);
}
你去了,它甚至内置了分区。枢轴应该是随机选择的,但是那是另一天,我想。
答案 1 :(得分:1)
这是一个非常愚蠢的错误。
在聚会功能中交换[商店]和[q]:
T = A [存储];一个[商店] = A [Q];一个[Q] =α[存储]; -----&GT;这是错误的。
a [q] = t应该是最后一个陈述。
现在它运作正常。无论如何,感谢您的超快反应。