堆排序

堆排序有两个操作:1.建堆 2.弹出堆头

大根堆的实现过程:

 1 #include <bits/stdc++.h>
 2 using  namespace std;
 3 class HeapSort{
 4 private:int heapsize = 0;
 5 public:
 6     void Heapsort(vector<int> &nums){
 7         if(nums.size() < 2){
 8             return ;
 9         }
10         for(int i =0;i < nums.size();i++){
11             //插入大根堆
12             Heapinsert(nums,i);
13         }
14         heapsize = nums.size();
15     }
16     void Heapinsert(vector<int> &nums,int i ){
17         //i位置的值比父亲位置的值大,交换,一直换到它应该在的位置。
18         while(nums[i] > nums[(i-1)/2] ){
19             //位运算进行交换
20             nums[i] ^= nums[(i-1)/2];
21             nums[(i-1)/2] ^= nums[i];
22             nums[i] ^= nums[(i-1)/2];
23              i = (i-1)/2;
24         }
25     }
26     //某个数在index处,能不能往下移动
27     void heapify(vector<int> &nums,int index ){
28         int left = index*2+1;
29         while(left < heapsize){//左孩子下面还有孩子
30             //lager存的是大孩子的值
31             int lager = left +1  <heapsize && nums[left] < nums[left+1]? left+1 : left;
32             lager = nums[lager] > nums[index] ? lager : index;//要不要往下移动
33             if(nums[lager] == nums[index]) break;//用不着往下移动
34             else{
35                 //下移
36                 nums[index] ^= nums[lager];
37                 nums[lager] ^= nums[index];
38                 nums[index] ^= nums[lager];
39                 //更新检查的下标,看是否还需要往下移
40                 index = lager;
41                 left = index * 2+1;
42             }
43         }
44     }
45     //要把0 位置的值拿走,并且更新大根堆,做法是:把0位置的值取出,把最后位置的值放入0 位置,每个位置和自己的值大的孩子比较,如果小于,就交换位置。
46     //记住要更新heapsize;
47     int returnfirst(vector<int> & nums){
48         int res = nums[0];
49         heapsize--;
50         nums[0] = nums[heapsize];
51         heapify(nums,0);//O(logN)
52         return res;
53     }
54 };
55 
56 int main() {
57     vector<int> ans ={6,5,4,7,-1,9,100};
58     HeapSort a;    a.Heapsort(ans);
59     int b = a.returnfirst(ans);
60     return 0;
61 }

 

posted @ 2022-05-03 14:34  coyote25  阅读(20)  评论(0编辑  收藏  举报