堆排序

堆排序:

 

 1 class HeapSort {
 2 public:
 3     void sink(vector<int>& nums, int i , int n ) {
 4         while(i*2+1 <n) {
 5             int j = i*2+1;
 6             if (j+1 < n && nums[j+1] > nums[j]) j++; //找到大的儿子
 7             if ( nums[i] < nums[j] ) { // 当前节点 小于儿子,下沉
 8                 swap(nums[i],nums[j]);
 9                 i = j;
10             } else {
11                 break;
12             }
13         }
14     }
15     void heap_sort(vector<int>& nums) {
16         int N = nums.size();
17         // build heap
18         for(int i = N/2; i >= 0;i--) {
19             sink(nums,i,N);
20         }
21         // sort 
22         for(int n = N -1 ;n>=0;n--) {
23             swap(nums[n],nums[0]);
24             sink(nums,0,n);
25         }
26     } 
27 };

 

 

 

 

 

 二叉树--->满二叉树--->完全二叉树---->堆有序的完全二叉树, 就叫做二叉堆。(最大堆:任意一个父节点都大于等于它相邻的所有子节点)

 

 

 

 

 

 数组表示

 在一个堆中,位置k的节点的父节点的位置是k/2, 而两个子节点的位置则分别是2k和2k+1

层序遍历:

 

 

新加元素: 上浮

替换元素:下沉

 

 

堆中插入元素:新元素加到数组末尾, 让这个新元素上浮到合适的位置

堆中删除最大元素:数组顶端删除最大的元素,并将数组的最后一个元素放到顶端,让这个元素下沉到合适的位置

 

 

 

堆排序: 通过下沉实现

 

 

 

 

 

 

https://zhuanlan.zhihu.com/p/31440467

posted @ 2022-03-27 13:09  乐乐章  阅读(23)  评论(0编辑  收藏  举报