排序算法(二):快速排序

排序思路:
分而治之。以首位元素作为分割标准(pivot),小于该值的元素(无需排序)置于pivot前部,大于该值的元素(无需排序)置于pivot后部。采用递归思想,对“前部数组”进行分割,后部数组同样进行分割。直到无法继续“分割”。
样例:

{22,35,16,9,5,20} 

1.设定游标j指向数组末尾;设定游标i指向数组起始位。
2.找标志位(一般的,我们取array[i]作为我们的首位)

{__35169520}  pivot=22i=0, j=5)

3.若array[j]小于key,则将array[j]赋值给array[i]

{20351695__}  pivot=22i=0, j=5)

4.若array[i]大于key,则将array[i]赋值给array[j]

{20,__,169535}  pivot=22i=1, j=5

5.从之前游标j停止的位置,继续重复步骤3

{205169,__,35}  pivot=22i=1, j=4

6.从之前游标i停止的位置,继续重复步骤4
此时,我们发现,当i=4时,已经与j发生重合,数组已经遍历了一遍。“分割”操作结束。我们将key值填入array[4]。

{2051692235}  pivot=22i=4, j=4

7.至此,我们选取原始array[0]值作为pivot,已经将数组分割成{20,5,16,9} {22} {35}。我们再对{20,5,16,9}进行划分。重复步骤1,如此往复。

{__5169}  pivot=20i=0, j=3)
{9516__}  pivot=20i=0, j=3)
{951620}  pivot=20i=3, j=3)

中间结果:{9,5,16} {20} {22} {35}

{__516} pivot=9i=0, j=2)
{5__16} pivot=9i=0, j=1)
{5916} pivot=9i=1, j=1)

中间结果:{5,9}{16} {20} {22} {35}

{__,9} pivot=5 (i=0,j=1)
{59} pivot=5 (i=1,j=1)

中间结果:{5}{9}{16} {20} {22} {35}
最终结果:

{5,9,16,20,22,35}

c实现

void quickSort(int array[], int start, int end) {

    if(start>=end){
        return;
    }
    int i=start;
    int j=end;
    int pivot=array[i];

    while(i<j){
        while(array[j]>pivot && i<j){
            j--;
        }
        array[i]=array[j];
        while(array[i]<pivot && i<j){
            i++;
        }
        array[j]=array[i];
    }

    array[i]=pivot;
    quickSort(array, start, i-1);
    quickSort(array, i+1, end);
}

平均时间复杂度为O(nlogn),最坏为O(n2)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值