排序--快速排序

1、引

  • 冒泡排序有他有缺点,它是相临的两个元素之间的交换,效率比较低,对于数据比较多的排序显然是不行的。快速排序是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。

2、基本思想

  • 快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

考虑如下数组:
9,3,6,5,7,4

第一步:

  • 先一个pivot,这个pivot可以随便选,可以定一个算法 pivot = array[n/2],取中间的数
    pivot = 5;

第二步:

  • 从左长比pivot大的数,从右找比pivot 小的数
    从左找到9,从右找到 4

第三步:

  • 将第二步找到的两个数交换
    4,3,6,5,7,9

第四步:

  • 再找下一个满足 第二步条件的数据,一直到左右的下标相等,本轮交换结束。
    一轮交换后:
    4,3,5,6,7,9

第五步:

  • 第四步完成后,左下标以左的数据都比pivot小,以右的数据都比pivot大,这样就把一个无序的数组分成了两部分。
    – 4,3,5,这一边的数据都比5小(等于);
    – 6,7,9 ,这一边的数据都比5大;

第六步:

  • 对分割的两部分又重新从第一步开始,递归调用。

3、C语言实现

void quick_sort( int *array, int n)
{
    int left, right, pivot, tmp;
    if (n < 2)  return; //递归退出的条件

    pivot = array[n / 2]; //取中间的数为基准

    for ( left = 0, right = n -1;; left++, right--)
    {
        //从左边开始找大于pivot的数
        while (array[left] < pivot) 
            left++;

        //从右边开始找小于pivot的数
        while (pivot < array[right])
            right--;

        if ( left >= right) //本轮交换结束了
            break;

        //交换
        tmp = array[left];
        array[left] = array[right];
        array[right] = tmp;
    }

    quick_sort(array, left); //对左边的排序
    quick_sort(array + left, n - left);//对右边的排序
}

4、总结

  1. 分治
  2. 递归
  3. 交换

5、参考

https://www.youtube.com/watch?v=SLauY6PpjW4
http://developer.51cto.com/art/201403/430986.htmyc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值