[英]Quick Sort in C Issue
我在 C 语言的快速排序程序中遇到了某个问题。有人能指出错误在哪里吗? 我的代码无法运行,我尝试将其与多个在线程序进行比较。 我明天有一个测试,我想在尝试之前知道错误是什么。
#include <stdio.h>
void swap(int a,int b){
int t;
t=a;
a=b;
b=t;
}
int partition(int a[],int l,int h){
int pi=l,i=l,j=h;
while(i<j){
while(a[i]<=a[pi])
i++;
while(a[j]>a[pi])
j--;
if(i<j){
swap(a[i],a[j]);
}
}
swap(a[j],a[pi]);
return j;
}
void quicksort(int a[],int l,int h){
int j;
j=partition(a,l,h);
quicksort(a,l,j-1);
quicksort(a,j+1,h);
}
int main(){
int n,i;
printf("Enter the number of elements: ");
scanf("%d",&n);
int a[n];
printf("Enter the elements: ");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
quicksort(a,0,n-1);
printf("The array after sorting is: ");
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return 0;
}
函数参数在 C 中按值传递。您的swap
函数:
void swap(int a,int b){
int t;
t=a;
a=b;
b=t;
}
被传递了两个整数参数, int a
和int b
。 在函数内,它们的行为类似于局部变量,因此swap
函数内对a
和b
更改对调用者没有影响。
为了模拟通过引用传递的效果,您可以使用指针传递要修改值的对象的地址,并在函数内部取消引用指针以访问要修改的对象。
例如,您的swap
函数可以修改如下:
void swap(int *a,int *b){
int t;
t = *a;
*a = *b;
*b = t;
}
对该函数的调用也需要修改以传递其值将被交换的对象的地址。 例如, swap(a[i],a[j]);
需要改为swap(&a[i],&a[j]);
(或等效地,更改为swap(a+i,a+j);
)。
您的代码有几个问题。
首先,您的交换函数交换局部变量a
和b
,但它不会影响partition
的数组a
。 Ian Abbott 对此进行了更彻底的解释。
解决这个问题的一种方法是通过指针传递数组元素的地址,以便swap
可以访问和更改它们。 一种更简单的方法是编写一个对数组索引进行操作的交换函数:
void swap(int array[], int i, int j)
{
int t = array[i]; array[i] = array[j]; array[j] = t;
}
其次,必须在某个时间停止递归。 当你有一个只有一个元素或根本没有元素的数组时,没有什么可做的,因为数组(或子数组)已经排序。
所以在这种情况下不要做任何事情。 或者,更确切地说,仅当您至少有两个元素时才做某事。 这具有很好的副作用,即 recusrion 实际上停止了。 :)
void quicksort(int a[], int l, int h)
{
if (l < h) {
int j;
j = partition(a, l, h);
quicksort(a, l, j - 1);
quicksort(a, j + 1, h);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.