Skip to content

Commit e1b880d

Browse files
committed
堆排序优化
1 parent 311f8df commit e1b880d

File tree

1 file changed

+5
-11
lines changed

1 file changed

+5
-11
lines changed

MD/通用基础-排序算法.md

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,18 @@
33

44
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/quicksort.gif)
55

6-
首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
7-
8-
不稳定,如果最小的值在最后面,那么在第一次排序就被放到第一位,后面有与该值相等的元素也不会交换。
6+
首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序
97

108
最好情况:每次划分过程产生的区间大小都为n/2,一共需要划分log<sub>2</sub>n次,每次需要比较n-1次,O(nlog<sub>2</sub>n)
119
最坏情况:每次划分过程产生的两个区间分别包含n-1个元素和1个元素,一共需要划分n-1次,每次最多交换n-1次,这就是冒泡排序了,O(n2)
1210

1311
## 堆排序
1412

15-
堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示
16-
堆排序就是把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束
17-
13+
1. 根据初始数组去构造初始堆(构建一个完全二叉树,保证所有的父结点都比它的孩子结点数值大)。
14+
2. 每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下元素重新调整为大根堆。
15+
1816
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/j11.png)
1917

2018
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/heapsort.gif)
2119

22-
不稳定,27 27 12 3,第一次建堆把第一个27放到最后了,第二次就把第二个27放到第一个27前面了
23-
24-
堆排序过程的时间复杂度是O(nlog<sub>2</sub>n)。因为建堆的时间复杂度是O(n);调整堆的时间复杂度是log<sub>2</sub>n,所以堆排序的时间复杂度是O(nlog<sub>2</sub>n)
25-
26-
欢迎光临[91Code](http://www.91code.info/?utm_source=github&utm_medium=github),发现更多技术资源~
20+
堆排序过程的最好和最坏时间复杂度是O(nlog<sub>2</sub>n)

0 commit comments

Comments
 (0)