堆排序
堆排序有两个操作: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 }