【发布时间】:2018-03-06 01:02:30
【问题描述】:
我正在针对各种分布对其进行测试,并且在将反向(降序)排序数组作为输入时出现分段错误。有时它甚至适用于反向排序数组,有时我会遇到分段错误错误,特别是在大型反向排序数组(> 100000)上。是不是因为递归调用非常深,如果是,那么递归调用深度的限制是什么,它取决于哪些因素以及在编写递归程序时需要注意哪些预防措施。
int partation(double *a, int lower, int upper) {
int i = lower, j = upper;
double t = a[lower], temp;
while (i <= j) {
while (i <= upper && a[i] <= t)
i++;
while (a[j] > t)
j--;
if (i <= j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
temp = a[lower];
a[lower] = a[j];
a[j] = temp;
return j;
}
void quick_sort(double *a, int lower, int upper) {
int j;
if (lower >= upper)
return;
else {
j = partation(a, lower, upper);
quick_sort(a, lower, j - 1);
quick_sort(a, j + 1, upper);
}
}
【问题讨论】:
-
是时候学习如何使用
gdb了,看来j在这里可能是负数while(a[j]>t) j--; -
我不认为 j 可以是负数,因为第一个元素被选为枢轴所以它不能低于这个循环的第一个元素 while(a[j]>t) j--;当 j 减少到第一个索引时肯定会退出。
标签: c algorithm sorting data-structures quicksort