堆排序
堆排序:
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