update sort
This commit is contained in:
+2
-2
@@ -252,10 +252,10 @@ public void merge(int[] arr,int low,int mid,int high,int[] tmp){
|
||||
|
||||
1. 将待排序数列看做一颗完全二叉树的存储结构
|
||||
2. `堆化数组`,结束后,根a[0]变成了最小的值(小根堆)
|
||||
3. 取a[0]值,然后对`堆`做删除操作,此时,`堆`会重新 `堆化数组`,a[0]又是下一个最小的值。
|
||||
删除操作通常是先把数组最后的元素提到a[0]位置,然后从根节点开始进行一次从上向下的调整;调整时,先从左右孩子中找最小的交换。如果父节点比每个节点都小就不用调整。(因此,在`堆排序`是可以直接让 a[0]和数组最后一个元素互换,但要先保存好a[0],或者a[n-1],这样导致了使用`堆排序`时,递增排序使用大根堆,递减排序使用小根堆。)
|
||||
3. 取a[0]值,然后对`堆`做删除操作,此时,`堆`会重新 `堆化数组`,a[0]又是下一个最小的值。删除操作通常是先把数组最后的元素提到a[0]位置,然后从根节点开始进行一次从上向下的调整;调整时,先从左右孩子中找最小的交换。如果父节点比每个节点都小就不用调整。因此,在`堆排序`是可以直接让 a[0]和数组最后一个元素互换,但要先保存好a[0],或者a[n-1],这样导致了使用`堆排序`时,递增排序使用大根堆,递减排序使用小根堆。
|
||||
4. 循环3,就可以按从小到大的顺序取出所有数组元素。
|
||||
|
||||
|
||||
堆排序主要时间花在建堆期间和`堆化数组`,找数列中最大数只需要O(1)时间复杂度
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user