c - 快速排序 : Printing Memory Addresses instead of array elements:

标签 c algorithm sorting segmentation-fault quicksort

我已经编写了对整数数组进行快速排序的代码,但在打印时它在终端上显示了某种内存地址。想了很久都没成功。

我尝试在在线gdb编译器上编译它,但出现错误:Segmentation Fault(core dumped),否则,我尝试多次修改代码

#include<stdio.h>
void swap(int* a, int* b){
    int t = *a;
    *a = *b;
    *b = t;
}
int part(int arr[], int l, int r){    //for partioning the array
    int i=l, j=0;

    while(j<r){
            if(arr[j]<arr[r]){
                swap(&arr[j], &arr[i]);
                i++;
            }
        j++;
    }
    swap(&arr[i], &arr[r]);
return i;
}
void qsort(int arr[], int l, int r){    //recursive function for quicksort
    if(l<r){
        int p = part(arr, l, r);
        qsort(arr, l, p-1);
        qsort(arr, p+1, r);
    }
}
int main(void){
    int arr[] = {4, 10, 17, 5, 5, 6, 1 , 3, 0};

    qsort(arr, 0, 8);                 //function called

    for(int i=0; i<9; i++){            
        printf("%d ", arr[i]);       //for printing the array
    }
return 0;
}

实际结果:
11016472 1974520423 11016472 6356864 6 6356800 4214784 11015616 1974521024

我期待数组被排序。

最佳答案

部分,当l大于0时,部分中从0开始的j包括数组“左边”的部分l 在处理中,可能导致 i(已初始化为 l)递增太多次,超过 r.

int i=l, j=0; 更改为 int i=l, j=l; 会导致程序打印案例中所需的输出问题。

这个问题可以通过修改 qsortpart 来发现,每次调用它们时打印它们的参数,并在它们返回时打印或缩进前一个按当前递归深度打印(出于调试目的,可以使用静态计数器跟踪)。这立即揭示了对 qsort 的调用,其中 r 设置为 9,超出了数组,然后导致检查它是如何变成那样的。

关于c - 快速排序 : Printing Memory Addresses instead of array elements:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57827335/

相关文章:

c - 正确使用更改数据的自由功能

c++ - 计数排序卡在for循环中

python - 格式正确的乘法表

c++ - 创建无重复的随机数序列

angularjs - 当 ng-hide 在 2 个表之间分割时, Angular 奇数、偶数不起作用

python - 按日期对元组列表进行排序

输出困惑

c++ - 比较float和float文字时的奇怪输出

c - 错误, 'invalid operands to binary * (have ' long unsigned int' 和 'int *' )'

algorithm - 装箱 - 已知数量的独特盒子的变体和数量