C问题中的快速排序

C问题中的快速排序,c,quicksort,C,Quicksort,在C语言的快速排序程序中,我被卡在了某个点上。有人能指出错误在哪里吗?我的代码没有运行,我试着将它与多个在线程序进行比较。我明天有一个测试,我想在尝试之前知道错误是什么 #包括 无效掉期(整数a、整数b){ int t; t=a; a=b; b=t; } 整数分区(整数a[],整数l,整数h){ int pi=l,i=l,j=h; 而(i函数参数在C中按值传递。您的swap函数: void swap(int a,int b){ int t; t=a; a=b; b

在C语言的快速排序程序中,我被卡在了某个点上。有人能指出错误在哪里吗?我的代码没有运行,我试着将它与多个在线程序进行比较。我明天有一个测试,我想在尝试之前知道错误是什么

#包括
无效掉期(整数a、整数b){
int t;
t=a;
a=b;
b=t;
}
整数分区(整数a[],整数l,整数h){
int pi=l,i=l,j=h;
而(i函数参数在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);

您的代码有几个问题

首先,swap函数交换局部变量
a
b
,但它不会影响
分区中的数组
a
。Ian Abbott对此进行了更详细的解释

解决此问题的一种方法是通过指针传递数组元素的地址,以便
swap
可以访问和更改它们。更简单的方法是编写一个对数组索引进行操作的swap函数:

void swap(int array[], int i, int j)
{
    int t = array[i]; array[i] = array[j]; array[j] = t;
}
第二,必须在某个时候停止递归。如果数组只有一个元素或根本没有元素,则无需执行任何操作,因为数组(或子数组)已排序

因此,在这种情况下不要做任何事情。或者,只在至少有两个元素的情况下才做一些事情。这有一个很好的副作用,即循环实际上停止了。
:)

void快速排序(int a[],int l,int h)
{
if(l
您的交换将只交换局部变量
a
b
。它不会影响函数
分区中的数组
a
。我不明白您的意思,您能建议更正吗?@MOehm试图说的是
无效交换(int*a_ptr,int*b_ptr)…
应该给你一个提示。Bor建议的另一个替代方法是使用
无效交换(int数组[],int i,int j)
交换数组中的元素。我尝试在不使用指针的情况下进行交换,你能在没有指针的情况下完全完成交换函数吗?对不起,我无法正确理解如何完成。谢谢你的更正,但即使在我使用了你的建议之后,我的代码也给了我同样的问题。我似乎还没有修复递归问题,这就是它不起作用的原因。不过,我确实理解了传递值,谢谢你花时间向我解释。好的,是的,谢谢你,代码现在可以工作了,我正在尝试通过实现来学习,可能犯了太多错误,但我感谢你的学习。谢谢你花时间给我适当的解释。
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);
    }
}