快速排序
最差情况(n2):每次都只划分成(1个和剩下的),例如对排序好的数组,如果轴值每次都取第一个,那么每次都是分成1和剩下的,需要n次。
最差情况优化:可以随机取轴值(pivot)的位置,rand()用来确定pivot的位置。
最好情况(nlogn):每次都划分成等大(或者差1)的两块。树深为logn。
class Solution {public:int partition(vector<int>& nums,int l,int r){int pivot = nums[r];int i = l;for(int j=l;j<r;j++){if(nums[j]<pivot){swap(nums[i++],nums[j]);}}swap(nums[i],nums[r]);return l;}void qSort(vector<int>& nums,int l,int r){if(l>=r){return ;}int mid = partition(nums,l,r);qSort(nums,l,mid-1);qSort(nums,mid+1,r);}vector<int> sortArray(vector<int>& nums) {qSort(nums,0,nums.size()-1);return nums;}};
堆排序
升序排序:建一大顶堆,然后,每次把堆顶元素(最大)的换到最后,size-1后调整堆。
public:void maxHeapify(vector<int>& nums,int father,int heapSize){int l = father*2+1,r=father*2+2,largest=father;if(l<heapSize&&nums[l]>nums[largest]){largest = l;}if(r<heapSize&&nums[r]>nums[largest]){largest = r;}if(largest!=father){swap(nums[father],nums[largest]);maxHeapify(nums,largest,heapSize);}}void buildMaxHeap(vector<int>& nums,int heapSize){for(int i=heapSize/2;i>=0;i--){maxHeapify(nums,i,heapSize);}}vector<int> sortArray(vector<int>& nums) {int n = nums.size();int heapSize = n;buildMaxHeap(nums,heapSize);for(int i=n-1;i>=0;i--){swap(nums[0],nums[heapSize-1]);heapSize--;maxHeapify(nums,0,heapSize);}return nums;}};
