堆排序,时间复杂度O(N log N),实际使用中慢于使用Sedgewick增量的增量排序。
大致思路:
1.先在数组中建堆,如果是增量排序,则需要建一个大堆
2.每循环一次,把最大的数,也就是nums[0],放入堆尾,同时把nums[0]下滤
1 void heapsort(int *nums,int n) 2 { 3 int i; 4 for(i=n/2;i>=0;i--) 5 percdown(nums,i,n); 6 for(i=n-1;i>0;i--) 7 { 8 nums[0]^=nums[i]; 9 nums[i]^=nums[0]; 10 nums[0]^=nums[i]; 11 percdown(nums,0,i); 12 } 13 } 14 void percdown(int *nums,int p,int n) 15 { 16 int tmp; 17 int child; 18 for(tmp=nums[p];2*p+1<n;p=child) 19 { 20 child=2*p+1; 21 if(2*p+2!=n&&nums[2*p+2]>nums[child]) 22 child++; 23 if(nums[child]>tmp) 24 nums[p]=nums[child]; 25 else 26 break; 27 } 28 nums[p]=tmp; 29 30 }
时间: 2024-10-16 14:37:08