【算法】QuickSort

快速排序,时间复杂度O(N*logN),要能熟练掌握!

以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主!

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:

先来看实例吧,定义下面再给出(最好能用自己的话来总结定义,这样对实现代码会有帮助)。

以一个数组作为示例,取区间第一个数为基准数。


0


1


2


3


4


5


6


7


8


9


72


6


57


88


60


42


83


73


48


85

初始时,i = 0;  j = 9;   X = a[i] = 72

由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。

从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++;  这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;

数组变为:


0


1


2


3


4


5


6


7


8


9


48


6


57


88


60


42


83


73


88


85

i = 3;   j = 7;   X=72

再重复上面的步骤,先从后向前找,再从前向后找

从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;

从i开始向后找,当i=5时,由于i==j退出。

此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。

数组变为:


0


1


2


3


4


5


6


7


8


9


48


6


57


42


60


72


83


73


88


85

可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

最后是代码实现:

 1 #include <iostream>
 2 using namespace std;
 3
 4 void QuickSort(int m[], int l, int r) {
 5     int i = l, j = r, baseNumber = m[l];
 6
 7     if (l < r)    {
 8         while (i < j)    {
 9             //First Right
10             while (i < j && m[j] > baseNumber)
11                 j--;
12
13             if (i < j)
14                 m[i++] = m[j];
15
16             //Second Left
17             while (i < j && m[i] <= baseNumber)
18                 i++;
19
20             if (i < j)
21                 m[j--] = m[i];
22         }
23
24         m[i] = baseNumber;
25         QuickSort(m, l, i - 1);
26         QuickSort(m, i + 1, r);
27     }
28 }
29
30 int main()    {
31     int m[10] = {5, 6, 3, 2, 4, 7, 8, 1, 0, 9};
32     QuickSort(m, 0, 10);
33     for (int i = 0; i < 10; i++)
34         cout << m[i] << " ";
35
36     return 0;
37 }
时间: 2024-08-24 21:41:01

【算法】QuickSort的相关文章

快速排序算法(Quicksort)

快速排序算法是对集合中元素进行排序最通用的算法,俗称快排,其算法的时间复杂度为O(nlgn),空间复杂度为O(1). 我们举例来对其算法思路进行理解,譬如数组 A = { 4, 8, 1, 2, 9, 7, 3, 0, 5, 6 }; 第一步,以最后一个数6为基准,把小于等于6的数挪到数组左边,把大于6的数挪到数组右边. 那么结果为 { 4, 1, 2, 3, 0, 5, 8, 9, 7, 6 },这个时候再做一步,把8和6进行交换,得到{ 4, 1, 2, 3, 0, 5, 6, 9, 7,

排序算法(1) 快速排序 C++实现

快速排序基本特性 时间复杂度:O(n*lgn) 最坏:O(n^2) 空间复杂度:最好情况下:O(lgn),最坏情况:O(n),平均情况:O(lgn) 不稳定. 关于快速排序的空间复杂度,谢谢@命运他爹 同学指正.详述一下. 快速排序由于每次递归的时候会占用一个空间返回中间数位置,所以一次递归的空间复杂度为O(1). 最好情况和平均情况下的递归深度为O(lgn),相应的空间复杂度就是O(lgn) 最坏情况下的递归深度为O(n),空间复杂度为O(n). 算法 QUICKSORT(A, p, r)  

我的Java开发学习之旅------&gt;Java经典排序算法之快速排序

一.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解: 在R[low..high]中任选一

快速排序的递归和非递归分析

 1.算法思想     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解: 在R[low..hi

寻找最小的k个数(update)

类似编程之美中寻找最大的k个数 解法一: 题目没有要求最小的k个数有序,也没要求最后n-k个数有序.既然如此,就没有必要对所有元素进行排序.这时,咱们想到了用选择或交换排序,即: 1.遍历n个数,把最先遍历到的k个数存入到大小为k的数组中,假设它们即是最小的k个数: 2.对这k个数,利用选择或交换排序找到这k个元素中的最大值kmax(找最大值需要遍历这k个数,时间复杂度为 O(k) ): 3.继续遍历剩余n-k个数.假设每一次遍历到的新的元素的值为x,把x与kmax比较:如果 x < kmax

hadoop2-MapReduce详解

本文是对Hadoop2.2.0版本的MapReduce进行详细讲解.请大家要注意版本,因为Hadoop的不同版本,源码可能是不同的. 以下是本文的大纲: 1.获取源码2.WordCount案例分析3.客户端源码分析4.小结5.Mapper详解 5.1.map输入 5.2.map输出 5.3.map小结6.Reduce详解7.总结 若有不正之处,还请多多谅解,并希望批评指正. 请尊重作者劳动成果,转发请标明blog地址 https://www.cnblogs.com/hongten/p/hongt

pandas-06 Series和Dataframe的排序操作

pandas-06 Series和Dataframe的排序操作 对pandas中的Series和Dataframe进行排序,主要使用sort_values()和sort_index(). DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') by:列名,按照某列排序 axis:按照index排序还是按照column排序 ascending:是否升

排序算法四:快速排序(Quicksort)

快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是o(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 1 protected void quicksort(int[] array, int first, int last) { 2 3 int pivot = array[first]; 4 int i = first; 5 int j = last - 1; 6 boolean serachBig =

排序算法五:随机化快速排序(Randomized quicksort)

上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序.归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的.实际上,对于已经排好的序列,如果用快速排序时间复杂度是O(n2).为应对这样的有序序列,于是出现了本篇要讲的随机化快速排序(Randomized quicksort). 快速排序在选主元(pivot)时,总是选择第一个:随机化快速排序的思想是,随机从序列中选择一个作为主元. (一)算法实现 1 protected void quick

普林斯顿大学算法课 Algorithm Part I Week 3 快速排序 Quicksort

发明者:Sir Charles Antony Richard Hoare 基本思想: 先对数据进行洗牌(Shuffle the array) 以数据a[j]为中心进行分区(Partition),使得a[j]左侧的数据都小于等于a[j],a[j]右侧的数据都大于等于a[j] 分区完后递归排序 演示(Quicksort partitioning demo) 重复操作指导i和j指针相遇 当a[i] < a[lo]时,令i从左往右扫描 当a[j] > a[lo]时,令j从右往左扫描 交换a[i]和a[