//先将待排序的序列建成大根堆,此时整个序列最大值即为堆顶元素,将其与末尾元素交换,使末尾元素为最大值//然后再调整堆顶元素使得剩下的 n-1个元素仍为大根堆,再重复执行以上操作。//时间复杂度O(nlogn)//空间复杂度O(1)classSolution{voidmaxHeapify(int index,int size,vector<int>& nums){int left = index*2+1;while(left<size){//左右取大int largest = left+1<size && nums[left+1]>nums[left]? left+1:left;//父子取大
largest = nums[largest]>nums[index]?largest:index;if(largest==index)break;swap(nums[index],nums[largest]);
index = largest;
left = index*2+1;}}voidbuildMaxHeap(vector<int>& nums,int size){for(int i = size /2-1; i >=0;--i){maxHeapify(i,size,nums);}}voidheapSort(vector<int>& nums){int size = nums.size();buildMaxHeap(nums, size);for(int i = size-1; i >=0;--i){swap(nums[i], nums[0]);maxHeapify(0,i,nums);}}};
计数排序
//统计每个数个数,在按顺序还原//时间复杂度O(n)//空间复杂度O(n)classSolution{public:
vector<int>sortArray(vector<int>& nums){int Min = INT_MAX, Max = INT_MIN;for(int c : nums){
Min =min(c, Min);
Max =max(c, Max);}int len = Max - Min;
vector<int>bucket(len+1);for(int c : nums){
bucket[c - Min]++;}int j =0;for(int i =0;i <= len; i++){while(bucket[i]--){
nums[j++]= i + Min;}}return nums;}};
基数排序
//将整数按位数切割成不同的数字,然后按每个位数分别比较//时间复杂度O(n)//空间复杂度O(n)classSolution{public:
vector<int>sortArray(vector<int>& nums){int Max = INT_MIN;for(int c : nums){
Max =max(abs(c), Max);}int maxbits =0;while(Max){++maxbits;
Max/=10;}int len = nums.size();
vector<int>bucket(len);for(int i =0,exp =1;i<maxbits;++i,exp*=10){
vector<int>count(19);for(int i =0;i<len;++i){int digit =(nums[i]/exp)%10+9;
count[digit]++;}for(int i =1; i <19;++i){
count[i]+= count[i -1];}for(int i = len -1; i >=0;--i){int digit =(nums[i]/exp)%10+9;
bucket[count[digit]-1]= nums[i];
count[digit]--;}//copy(bucket.begin(), bucket.end(), nums.begin());//nums.swap(bucket);for(int i =0,j =0;i<len;++i,++j){
nums[i]= bucket[j];}}return nums;}};