首页 > 解决方案 > C中的快速排序(以相同的顺序)

问题描述

我试图实现快速排序算法,但无法将参数从一个函数传递到另一个函数。这是我所做的:

#include <stdio.h>

//int x, y;

void merge(int *a,int *b,int *c,int n1,int n2)
{ int i;  
      
for(i=0; i<n1+n2; i++)
{
     if(i<n1)
      c[i]=a[i];
      else
        c[i]=b[i-n1];
}
}

void partition(int start, int end, int arr[(end - start)], int *x, 
int *y) {

int n = end-start;
int small[n], equal[n], large[n], s = 0, e = 0, l = 0;

int p = arr[start];
for(int i = start; i<end; i++){
    if(arr[i] < p){
        small[s] = arr[i];
        s++;
    }
    else if(arr[i] > p){
        large[l] = arr[i];
        l++;
    }
    else{
        equal[e] = arr[i];
        e++;
    }
}
merge(small, equal, arr, s, e);
merge(arr, large, arr, (s+e), l);
e = e+s;
*x = s;
*y = e;
}


void quickSort(int ar[], int L, int R) {
// Complete this function
if(L < R){

    int x,y;

    partition(L, R, ar, &x, &y);

    quickSort(ar, L, x);
    quickSort(ar, y, R);
    for(int i = L; i<R; i++)
        printf("%d ", i);
    printf("\n");
}

}

int main(void) {
/*int ar_size;
scanf("%d", &ar_size);

int ar[ar_size], i;
for(i = 0; i < ar_size; i++) { 
    scanf("%d", &ar[i]); 
}
*/
int n = 7;
int s = 0;

int ar[7] = {5, 8, 1, 3, 7, 9, 2};

quickSort(ar, s, n);

return 0;
}

我在谷歌上搜索并尝试根据结果这样做:

void partition(int start, int end, int arr[(end - start)], int &x, 
int &y)

但是编译器向我显示了一个错误。这里的“x”和“y”是参考变量。编译器说存在分段错误。您能否还解释一下为什么会出现分段错误?

标签: csorting

解决方案


您的问题出在分区函数中。

s 和 e 是相对于 start 计算的,但是在设置值时没有考虑 start,这会导致它无限地分割数组的第一部分,这就是导致分段错误的原因(顺便说一句,a运行时错误不是编译错误)。

  *x = s + start;
  *y = e + start;

简单的解决方法是将开始重新添加到您的开始/结束计算中,然后一切都应该按照我所看到的进行。

提示:使用调试器或将 printfs 添加到您的代码中以查看它在做什么是了解您的代码为何可能出现错误行为的好方法。


推荐阅读