C中的Quicksort - 只是一个未排序的数字

时间:2018-05-21 22:25:26

标签: c algorithm quicksort

我试图实施一个快速排序算法,说实话得好,除了一个细节,一个数字最后没有排序......然后我尝试做的非常类似我看到的一本书,仍然是一样的(我确定这是代码中的一个非常小的细节,但我无法找到它)

我会在这里发布

#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; ----------这个小家伙

1 个答案:

答案 0 :(得分:1)

满足start < j时,也可以满足i < endelse-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