快速排序一趟之後,主元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很小,比如第五個最大的數,而整個陣列的長度非常的大,那麼,還有一種方法就是,我...