快速排序:找出最大最小的前K个数
快速排序:找出最大最小的前K个数 一.找出最小的k个数: 利用快速排序的原理,partition函数会找出mid值,mid左边的数都比mid小,而mid右边的数都比mid大所以只要找出k==mid的情况即可找到topK的数 时间复杂度:O(logn)* O(n) = O(nlogn) 其中O(n)是从头到尾遍历的复杂度,O(logn)是进行partition的复杂度 空间复杂度:O(n) 其中temp容器的空间复杂度是O(n) 注意:用这种方法是不能有重复数字的 //小的在左,大的在右, int partition_small ( vector < int > & a , int beg , int end ) { int i = beg , j = end ; int key = a [ i ] ; while ( i < j ) { while ( i < j && a [ j ] > key ) j -- ; //由于排序过程中不能有重复数字,所以a[i]>key是否取等也就无所谓了 if ( i < j ) a [ i ++ ] = a [ j ] ; else break ; while ( i < j && a [ i ] < key ) i ++ ; if ( i < j ) a [ j -- ] = a [ i ] ; else break ; } a [ i ]