[[121950]]
闲不多说。算法接下来,教程咱们立刻进入本文章的快速主题,排序算法。排序普及
众所周知,算法快速排序算法是教程排序算法中的重头戏。
因此,快速本文就从快速排序开始。排序普及
------------------------------------------------------
一、算法快速排序算法的基本特性
时间复杂度:O(n*lgn)
最坏:O(n^2)
空间复杂度:O(n*lgn)
不稳定。
快速排序是一种排序算法,对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。
通常是用于排序的***选择。因为,基于比较的排序,最快也只能达到O(nlgn)。
二、快速排序算法的描述
算法导论,第7章
快速排序时基于分治模式处理的,
对一个典型子数组A[p...r]排序的分治过程为三个步骤:
1.分解:
A[p..r]被划分为俩个(可能空)的子数组A[p ..q-1]和A[q+1 ..r],使得
A[p ..q-1] <= A[q] <= A[q+1 ..r]
2.解决:通过递归调用快速排序,对子数组A[p ..q-1]和A[q+1 ..r]排序。
3.合并。
三、快速排序算法
版本一:
QUICKSORT(A, p, r)
- if p < r
- then q ← PARTITION(A, p, r) //关键
- QUICKSORT(A, p, q - 1)
- QUICKSORT(A, q + 1, r)
数组划分
快速排序算法的关键是PARTITION过程,它对A[p..r]进行就地重排:
- PARTITION(A, p, r)
- x ← A[r]
- i ← p - 1
- for j ← p to r - 1
- do if A[j] ≤ x
- then i ← i + 1
- exchange A[i] <-> A[j]
- exchange A[i + 1] <-> A[r]
- return i + 1
ok,咱们来举一个具体而完整的例子。
来对以下数组,进行快速排序,
2 8 7 1 3 5 6 4(主元)
一、
i p/j
2 8 7 1 3 5 6 4(主元)
j指的2<=4,于是i++,i也指到2,2和2互换,原数组不变。
j后移,直到指向1..
二、
j(指向1)<=4,于是i++
i指向了8,所以8与1交换。
数组变成了:
i j
2 1 7 8 3 5 6 4
三、j后移,指向了3,3<=4,于是i++
i这是指向了7,于是7与3交换。
数组变成了:
i j
2 1 3 8 7 5 6 4
四、j继续后移,发现没有再比4小的数,所以,执行到了***一步,
即上述PARTITION(A, p, r)代码部分的 第7行。
因此,i后移一个单位,指向了8
i j
2 1 3 8 7 5 6 4
A[i + 1] <-> A[r],即8与4交换,所以,数组最终变成了如下形式,
2 1 3 4 7 5 6 8
ok,快速排序***趟完成。
4把整个数组分成了俩部分,2 1 3,7 5 6 8,再递归对这俩部分分别快速排序。
i p/j
2 1 3(主元)
2与2互换,不变,然后又是1与1互换,还是不变,***,3与3互换,不变,
最终,3把2 1 3,分成了俩部分,2 1,和3.
再对2 1,递归排序,最终结果成为了1 2 3.
7 5 6 8(主元),7、5、6、都比8小,所以***趟,还是7 5 6 8,
不过,此刻8把7 5 6 8,分成了 7 5 6,和8.[7 5 6->5 7 6->5 6 7]
再对7 5 6,递归排序,最终结果变成5 6 7 8。
ok,所有过程,全部分析完成。
***,看下我画的图:
快速排序算法版本二
不过,这个版本不再选取(如上***版本的)数组的***一个元素为主元,
而是选择,数组中的***个元素为主元。
- /
(责任编辑:百科)
神火股份:3月23日融资净偿还37.10万元 当前融资余额为6.29亿元
还安装了 IE5.5 和 Office 2000,网友改造 Windows 11 系统营造 Windows 2000 使用体验
Shell In A Box:一款访问远程Linux服务器的SSH终端