【问题标题】:Quicksort in C - Just a number not sortedC中的快速排序 - 只是一个未排序的数字
【发布时间】: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) { ... } 会更好。

标签: c algorithm quicksort


【解决方案1】:

start &lt; j满足时,i &lt; 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) &gt;&gt; 1

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多