【发布时间】:2018-10-31 14:40:11
【问题描述】:
我正在尝试实现一个快速排序算法,老实说,它进行得很好,除了一个细节,一个数字最后没有排序......然后我试着做它,就像我在一本书中看到的那样,还是一样(我确定这是代码中的一个非常小的细节,但我就是找不到)
我会发在这里
#include <stdio.h>
#include <stdlib.h>
int i,j,x,y;
void qs(int *vect,int start, int end);
int main() {
int arr[] = {0,4,5,6,9,3,2,1};
int amount;
amount= sizeof(arr)/sizeof(arr[0]);
//print array
for ( i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
printf("before = [%d]\n",arr[i]);
}
qs(arr,0,amount-1);
for ( i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
printf("after: [%d]\n",arr[i]);
}
return 0;
}
void qs(int *vect,int start, int end){
i = start;
j = end;
x = vect[(start + end)/2];
do {
while(vect[i] < x && i < end){
i++;
}
while (vect[j] > x && j > start){
j--;
}
if (i<=j) {
y = vect[i];
vect[i] = vect[j];
vect[j] = y;
i++;
j--;
}
}
while(i<=j);
if (start<j) {
qs(vect,start,j);
}
else{
if (i<end) {
qs(vect,end,i);
}
}
return ;
}
结果:
之前 = [0]
之前 = [4]
之前 = [5]
之前 = [6]
之前 = [9]
之前 = [3]
之前 = [2]
之前 = [1]
__
之后:[0]
之后:[1]
之后:[2]
之后:[3]
之后:[4]
之后:[5]
之后:[9]
之后:[6]
【问题讨论】:
-
经过简短的扫描后,我发现
qs(vect,end,i)应该是qs(vect, i, end),不是吗? -
另外,作为建议:模式
else { if (cond) { ... } }通常写成else if (cond) { ... }会更好。