我已经编写了对整数数组进行快速排序的代码,但在打印时它在终端上显示了某种内存地址。想了很久都没成功。
我尝试在在线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;
会导致程序打印案例中所需的输出问题。
这个问题可以通过修改 qsort
和 part
来发现,每次调用它们时打印它们的参数,并在它们返回时打印或缩进前一个按当前递归深度打印(出于调试目的,可以使用静态计数器跟踪)。这立即揭示了对 qsort
的调用,其中 r
设置为 9,超出了数组,然后导致检查它是如何变成那样的。
关于c - 快速排序 : Printing Memory Addresses instead of array elements:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57827335/