我试图实施一个快速排序算法,说实话得好,除了一个细节,一个数字最后没有排序......然后我尝试做的非常类似我看到的一本书,仍然是一样的(我确定这是代码中的一个非常小的细节,但我无法找到它)
我会在这里发布
#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]&lt; ----------这个小家伙答案 0 :(得分:1)
满足start < j
时,也可以满足i < end
。 else-if
用法会阻止考虑这种情况。此外,我同意 define cindy const 的说法,qs(vect,end,i)
应该是qs(vect, i, end)
。所以,改变你的递归案例,如
if (start < j) {
qs(vect, start, j);
}
if (i < end) {
qs(vect, i, end);
}
但是,我认为更好,
void qs(int *vect,int start, int end) {
int i,j,x,y;
if (start < end)
{
i = start;
j = end;
x = vect[((unsigned int)start + (unsigned int)end) >> 1];
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 );
qs(vect, start, j);
qs(vect, i, end);
}
}
此外,(start + end) / 2
不好,因为它可能会引发溢出。相反,您可以使用((unsigned int)start + (unsigned int)end) >> 1
。