找出陣列中第K大或者是第K小的數(利用快速排序)

2021-08-22 04:34:59 字數 977 閱讀 5986

快速排序一趟之後,主元pivot到了他最終應該在的位置,如果是從小到大排序,那麼一趟排序之後,他左邊的數都是比它小的,他右邊的數都是比它大的數,所以,如果我們要找出第k小的數,我們可以在一趟排序後,檢查主元的位置和k是否對應

if(pos+1 == k),因為下標是從0開始的,所以要加1。如果相等的話,就正好是要找的第k小的數,否則,if(pos+1>k),說明要找的數在主元的左邊,我們就只需要對左邊繼續進行快排,這樣可以節約時間。if(pos+1找第k大的數時,就是把陣列從大到小來排,只需要在劃分子集的函式中,將大於小於號調換一下。

#includeusing namespace std;

//從小到大排序

int partion1(int a, int low, int high)

a[low] = pivot;

return low;

}//修改大於小於號後,從大到小排序

int partion2(int a, int low, int high)

a[low] = pivot;

return low;

}//呼叫從小到大排序的分割法,來找出第k小的數

int find_k_small(int a, int low, int high, int k)

else

return -1;

}//找出第k大的數

找第K大或者小的數

這個題的解法 可以先通過排序得到第k個數即是第k大數。第二種解法就是利用快速排序的partition,這是一種隨機演算法,最壞情況下是n平方的,但是 平均情況下是 線性的。如下 此劃分的原理為,預設將地位的資料儲存,然後利用這個位置作為緩衝,不斷賦值。其中start永遠指向空位。最後將儲存的資料放入...

演算法題 BFPRT演算法 求第K小或者第K大的數

2017 11 21 bfprt問題 乙個陣列中求第k小或者第k大的數 不通過排序求第k小的數,時間複雜度為o n 1 找到乙個劃分值,按照partition的過程,分為小於區 等於區 大於區,則可知等於區是在整個陣列有序後不變的部分。2 求第k小的數,就是陣列有序後下標為k 1的數。3 所以,如果...

找出第k大的數

問題 從乙個陣列裡面,找出第k大的數。題目很簡單,要想把第k個數找出來,其實也挺容易的。第一種方法 無非就是先排序,比如用merge sort演算法,整個演算法複雜度為 o nlgn 然後找到第k個即可。第二種方法 如果k很小,比如第五個最大的數,而整個陣列的長度非常的大,那麼,還有一種方法就是,我...