繁体   English   中英

C 问题中的快速排序

[英]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 aint b 在函数内,它们的行为类似于局部变量,因此swap函数内对ab更改对调用者没有影响

为了模拟通过引用传递的效果,您可以使用指针传递要修改值的对象的地址,并在函数内部取消引用指针以访问要修改的对象。

例如,您的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); )。

您的代码有几个问题。

首先,您的交换函数交换局部变量ab ,但它不会影响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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM