c - 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”是参考变量。编译器说存在分段错误。您能否还解释一下为什么会出现分段错误?
解决方案
您的问题出在分区函数中。
s 和 e 是相对于 start 计算的,但是在设置值时没有考虑 start,这会导致它无限地分割数组的第一部分,这就是导致分段错误的原因(顺便说一句,a运行时错误不是编译错误)。
*x = s + start;
*y = e + start;
简单的解决方法是将开始重新添加到您的开始/结束计算中,然后一切都应该按照我所看到的进行。
提示:使用调试器或将 printfs 添加到您的代码中以查看它在做什么是了解您的代码为何可能出现错误行为的好方法。
推荐阅读
- excel - 您如何计算excel中两列集中相同数据集的出现次数?
- asp.net - 从数据库到 ASP.NET MVC 中的视图的角度日期显示
- ansible - Ansible 没有创建 .retry 文件
- mysql - 将默认 H2db 更改为 MySql 以便 jbpm 与 springboot 集成
- json - 如何在同一包中的 javascript 代码中获取 JSON 值?
- mysql - In a table of multiple invoices per client, I want to identify the first invoice (row) for each client
- xml - Removing the stylesheet from an XML file
- python - microphyton:使用 lib 机器的错误状态 1
- python-3.x - 加载数据时出现内存问题
- javascript - 如何获取从周一到周日的工作日列表 momentjs