排序--快速排序

来源:互联网 发布:三级数据库题型 编辑:程序博客网 时间:2024/06/05 22:35

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

原创粉丝点击