快速排序

来源:互联网 发布:闪电站小猪知乎 编辑:程序博客网 时间:2024/05/16 18:33

之前一直对快速排序算法感觉很有兴趣,但是一直懒癌发作,对中间数的阀值问题懒得思考,今天静下心,不到半个钟也做好了。

果然,人啊,不是做不到,就怕懒得动。以后还要多写多练。

本代码欢迎转载,但转载时请注明转自《极地大王章的博客》。


简要说明:

快速排序:取某个数为“基准”值,网上有称之为哨兵,我觉得蛮形象的。从前往后,从后往前,将比哨兵小的数放在左边,大于等于哨兵的数,放在右边,依次循环一遍,最后将哨兵放在合适的位置。

依次递归左右两边子链,最后得到排好序的链。

我这里选的是最右边的数为基准值。




int quickSort(int a[], int left, int right)
{
    if(left >= right)
    {
        return 0;
    }

    int Base = right;
    right --;
    while(left < right)
    {
        if(a[left] >= a[Base] && a[right] < a[Base])
        {
            int tmp = a[left];
            a[left] = a[right];
            a[right] = tmp;
            left ++;
            right --;
        }
        else if(a[left] >= a[Base] && a[right] >= a[Base])
        {
            right --;
        }
        else
        {
            left ++;
        }
    }

    if(left == right)
    {
        if(a[left] > a[Base])
        {
            int tmp = a[left];
            a[left] = a[Base];
            a[Base] = tmp;
            quickSort(a, 0, left-1);
            quickSort(a, right+1, Base);
        }
        else if (a[left] == a[Base])
        {
            quickSort(a, 0, left-1);
            quickSort(a, right+1, Base);
        }
        else
        {
            quickSort(a, 0, left);
            quickSort(a, right+1, Base);
        }
    }
    else //right < left && a[right] < a[Base] < a[left]
    {
        //right在前,left在后,right 小于left
        int tmp = a[Base];
        a[Base] = a[left];
        a[left] = tmp;
        quickSort(a, 0, right);
        quickSort(a, left+1, Base);
    }

    return 0;
}

int main()
{
    int arr[] = {88,25,64,64,94,39,45,8,38,44,34,51,102,3,4,4,4,5,6,145,23,23,57};
    int num = sizeof(arr)/sizeof(int);

    quickSort(arr, 0, num-1);
    for(int i = 0; i < num; ++i)
    {
        cout << arr[i] << " ";
    }
    cout << endl;

    getchar();
    return 0;
}


原创粉丝点击