排序算法——快速排序

240人阅读 评论(0) 收藏 举报
分类:

今天介绍快速排序,这也是在实际中最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。

思想

快速排序采用的思想是分治思想。

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

举例说明一下吧,这个可能不是太好理解。假设要排序的序列为

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。

代码

复制代码
int quicksort(vector<int> &v, int left, int right){
if(left < right){
int key = v[left];
int low = left;
int high = right;
while(low < high){
while(low < high && v[high] > key){
high--;
}
v[low] = v[high];
while(low < high && v[low] < key){
low++;
}
v[high] = v[low];
}
v[low] = key;
quicksort(v,left,low-1);
quicksort(v,low+1,right);
}
}
复制代码


分析

快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)

在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)

尽管快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。

查看评论

常见排序算法(三)(快速排序、归并排序、计数排序)

本文介绍排序算法中的快速排序、归并排序、计数排序,并对每种排序算法进行了分析,附带java实现代码。...
  • sysukehan
  • sysukehan
  • 2016-09-25 14:45:19
  • 2300

【PHP-排序算法】快速排序、堆排序算法时间复杂度比较

介绍 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,...
  • qq_28194557
  • qq_28194557
  • 2017-05-05 15:38:38
  • 1061

【图解算法】排序算法——快速排序

简介 首先还是得简单的介绍一下快速排序这个算法。 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况...
  • xiaoping0915
  • xiaoping0915
  • 2017-06-13 19:25:10
  • 3102

需要手写的算法之----------快速排序的排序的列子

int Partion(vector &vec , int begin , int end ){ if(begin == end ){ return begin; } if(begin ...
  • iihtd
  • iihtd
  • 2016-04-21 10:40:17
  • 437

php 二维数组快速排序算法

二维数组快速排序 快速排序
  • xingjigongsi
  • xingjigongsi
  • 2014-04-01 21:47:16
  • 1462

iOS算法(一)快速排序算法

快速排序是当遇到较大数据时,排序快,高效的方法(公司面试时,基本上会被问到...) 该方法的基本思想是: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于...
  • m372897500
  • m372897500
  • 2016-05-16 13:04:50
  • 2803

算法系列(四)排序算法中篇--归并排序和快速排序

在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。 概述 冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序...
  • robertcpp
  • robertcpp
  • 2016-05-30 23:04:57
  • 4696

排序算法系列:快速排序算法

本文就来说说交换排序的最后一拍:快速排序算法。本文就其原理、过程及实现几个方面讲解一下快速排序算法。...
  • u013761665
  • u013761665
  • 2016-03-01 15:40:07
  • 33371

汇编排序算法代码总结

1 冒泡排序 http://blog.csdn.net/a123443/article/details/6779137 ;冒泡排序 ;author JRH ;2011.7.10 assume ds:...
  • bcbobo21cn
  • bcbobo21cn
  • 2016-06-07 11:43:22
  • 2505

经典排序算法----快速排序算法(不稳定)

不稳定的排序算法 平均时间复杂度O(nlongn),最坏的情况O(n2),相对于时间复杂度同样为O(nlogn)的算法而言要更快一些,因为它的内部循环(inner loop)可以在大部分的架构上很有效...
  • qianqin_2014
  • qianqin_2014
  • 2016-04-21 11:40:01
  • 1487
    个人资料
    等级:
    访问量: 55万+
    积分: 6904
    排名: 4207
    最新评论