我在代码块上运行此代码并在quicksort.exe
停止工作时收到错误。主要功能正常。是什么原因?我该如何解决这个问题?
#include <stdio.h>
#include <stdlib.h>
void quicksort(int *,int,int);
int part(int *,int,int);
int main()
{
int i,n, a[100];
printf("Enter the length of array\n");
scanf("%d",&n);
printf("Enter array elements\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,0,n-1);
printf("\nSorted array:\n");
for(i=0;i<n;i++)
printf("%d\n",a[i]);
return 0;
}
void quicksort(int *a,int lb,int ub)
{
int p;
if(lb>ub)
return;
p= part(a,lb,ub);
quicksort(a,lb,p-1);
quicksort(a,p+1,ub);
return;
}
int part(int *x, int l, int u)
{
int piv,i,t,t2,pos=l;
piv=x[u];
for(i=l;i<=u;i++)
{
if(x[i]<=piv)
{
t=x[i];
x[i]=x[pos];
x[pos]=t;
pos++;
}
}
t2=x[pos];
x[pos]=x[u];
x[u]=t2;
return pos;
}
虽然所有其他排序算法都运行良好。我在mergesort中遇到问题并快速排序。
是递归还是指针的问题?
答案 0 :(得分:0)
您可以通过此修改您的代码(有两个代码最接近您的想法,我添加注释):
#include <stdio.h>
#include <stdlib.h>
void quicksort(int *,int,int);
int part(int *,int,int);
int main()
{
int i,n, a[100];
printf("Enter the length of array\n");
scanf("%d",&n);
printf("Enter array elements\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,0,n-1);
printf("\nSorted array:\n");
for(i=0;i<n;i++)
printf("%d\n",a[i]);
return 0;
}
void quicksort(int *a,int lb,int ub)
{
int p;
if(lb>ub)
return;
p= part(a,lb,ub);
quicksort(a,lb,p-1);
quicksort(a,p+1,ub);
return;
}
int part(int *x, int l, int u)
{
int piv,i,t,pos=l-1; //not pos = l
piv=x[u];
for(i=l;i<=u;i++) // You can write:for(i = l; i < u; i++)
{
if(x[i]<=piv)
{
pos++; //pos should add 1 before swap
t=x[i];
x[i]=x[pos];
x[pos]=t;
}
}
//If you write for(i = l; i < u; i++), use the following three lines of code
//t2=x[pos+1];
//x[pos+1]=x[u];
//x[u]=t2;
return pos;
}
我认为您的代码崩溃的原因是如果您在交换后使用pos = l
并编写pos++
,x[pos]
可能会超出边界。但即使您修改它,还有其他错误。也许你要画一张图片来理解快速排序并了解更多细节。