快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

基本思想:
进行一趟排序
1、 要先将待排序列中选一个记录出来作为标准,称为枢纽。
2、 将要排序的数据分割成独立的两部分,其中一部分的所有数据都比枢纽都要小,另一部分比枢纽大。
3、 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

举个例子:将序列(42,30,68,98,86,15,57)进行快速排序

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这时即划分完毕,为(15,30),42,(98,86,68,57)

于是经过递归调用后,排序完毕。

原始序列:
(42,30,68,98,86,15,57)
一次划分后:
(15,30),42,(98,86,68,57)
分别对42两边进行快排:
15,(30 结束),42,(57,86,68),98
15,30,42,57,(86,68),98
15,30,42,57,68,86,98 (结束)

代码分析
设置启动函数,即调用qSort(),指定起点为数组起点,终点为数组尾部

void quickSort(int * list, int length)//启动函数,length为数组长度
{
    qSort(list, 0, length - 1);         //指定是整个数组
    return;
}

qSort()是递归调用函数,参数为数组,以及排序起点,排序终点。通过partition()得到划分位置的枢纽后,如果起点仍小于终点时,递归调用qSort(),对左边和右边进行排序。

void qSort(int * list, int start, int end)          //递归调用
{
    int partpos = partition(list, start, end);      //通过调用划分函数,返回枢纽的位置
                                                    //枢纽的左边是比枢纽小的数,枢纽的有右边是比枢纽大的数
    if (start < end)
    {
        qSort(list, start, partpos - 1);            //对枢纽左边的数调用qSort进行递归调用进行排序
        qSort(list, partpos + 1, end);              //对枢纽右边的数调用qSort进行递归调用进行排序
    }
    return;
}

partition() 是对数组的划分,然后返回枢纽位置。把第一个记录拿出来作为枢纽,将low指向待排记录的第一个记录,high指向最后一个记录。首先将high所指的位置先前移动,直到找到第一个比枢纽关键字小的记录并将其复制至low所指的位置。然后将low所指的位置先后移动,直到找到第一个比枢纽关键字大的记录并将其复制至high所指的位置。如此反复交替移动位标high和low,直至low和high 相等,将枢纽复制至low所指的位置。

int partition(int * list, int low, int high)        //一次划分
{
    int temp = list[low];                           //将list[low]作为枢纽,存到temp中
    while (low < high)                              //要时刻保证low<high
    {
        while (low < high && list[high] > temp)     //当list[high]的数大于temp时,high指针往下指
                                                    //相当于保证比枢纽小的数一直在前面,后面都为比枢纽大的数据
        {
            high--;
        }
        list[low] = list[high];                     //如果list[high]<temp时,跳出循环,把这个数放到前面枢纽的位置
        while (low < high && list[low] < temp)      //当list[low]的数小于temp时,low指针往上指
                                                    //相当于保证比枢纽大的数放在后面,前面都为比枢纽小的数据
        {
            low++;                                      
        }
        list[high] = list[low];                     //此时list[low]的数比枢纽大,将这个数后移至list[high]处
    }
    list[low] = temp;                               //把枢纽放在low位上,这时前面的数据比枢纽小,后面的数据比枢纽大
    return low;                                     //返回枢纽的位置
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值