/** 无优化重复数据 */intmyPartition(vector<int>&arr,int left,int right){int small = left -1;while(left < right){if(arr[left]< arr[right])vectorSwap(arr, left++,++small);else left++;}vectorSwap(arr, small +1, right);return small +1;}voidquickSort(vector<int>&arr,int left,int right){if(left < right){int pivot =myPartition(arr, left, right);quickSort(arr, left, pivot -1);quickSort(arr, pivot +1, right);}}/** 对重复数据进行优化 *//** 荷兰国旗问题:给定一个划分值,将数组划分为小于区,等于区,大于区
小于区 | 等于区 | (当前判断位置)待定区 | 大于区 */
vector<int>myPartition(vector<int>&vec,int left,int right){int small = left -1;int big = right;while(left < big){if(vec[left]< vec[right])vectorSwap(vec,++small, left++);elseif(vec[left]> vec[right])vectorSwap(vec,--big, left);else left++;}vectorSwap(vec, big, right);
vector<int> equalVec ={small +1, big};return equalVec;}voidquickSort(vector<int>&vec,int left,int right){if(left < right){vectorSwap(vec, right, left +random(right - left +1));
vector<int> equalVec =myPartition(vec, left, right);quickSort(vec, left, equalVec[0]-1);quickSort(vec, equalVec[1]+1, right);}}
堆排序
平均/最好/最差 时间复杂度:O(NlogN)
额外空间复杂度:O(1)
不稳定
堆:完全二叉树
大/小根堆:所有子树(包括自身)最大/小值都在对应树的根节点。
用数组表示完全二叉树:当前节点/数组下标 i --> 左孩子 i * 2 + 1,右孩子 i * 2 + 2,父节点 (i - 1) / 2
voidheapInsert(vector<int>&vec,int index){while(vec[index]> vec[(index -1)/2]){vectorSwap(vec, index,(index -1)/2);
index =(index -1)/2;}}voidheapify(vector<int>&vec,int index,int size){int left = index *2+1;while(left < size){int largest =(left +1< size)&&(vec[left +1]> vec[left])? left +1: left;
largest = vec[largest]> vec[index]? largest : index;if(largest == index)break;vectorSwap(vec, index, largest);
index = largest;
left = index *2+1;}}voidheapSort(vector<int>&vec){if(vec.size()<2)return;for(int i =1; i < vec.size(); i++){//建大根堆heapInsert(vec, i);}int heapSize = vec.size();vectorSwap(vec,0,--heapSize);while(heapSize >1){heapify(vec,0, heapSize);vectorSwap(vec,0,--heapSize);}}