題目
以較高的效率求一組無序陣列中按從小到大排序後第k個數的值。
用上了我學會但不太熟的雙指標快速排序。
**如下:
public static int selectk(int arr, int l, int r, int k)
//快速排序
public static int partition(int arr, int l, int r)
int p = arr[l];
int left = l + 1;
int right = r;
while (left <= right)
while (left <= right && arr[right] > p)
if (left < right)
}utils.swap(arr, l, right);
return right;
}
本題給我帶來的收穫是加深了我對雙指標快速排序的應用。
首先先將初始陣列第一次劃分partition(arr, 0, arr.length-1)。將arr[l],arr[mid],arr[r]中為中位數的值放到應該在的位置然後返回right。
因為對右指標的限定條件為left<=right&&arr[right]>p 所以right最後會停在左側陣列中最後乙個比p小的位置,此位置即為本次p應該所在的位置。然後用q-l+1可以得出p在排序好之後所處位置。
測試**:
結果如下:
尋找最小k個數或者尋找第K大的數字
輸入n個整數,找出最小的前k個數字 或者第k大的數字 例如輸入4,5,1,6,2,7,3,8這八個數,則輸出最小4個數是1,2,3,4.o n 解法,需要修改輸入陣列。可以採用快速排序partition函式來解決這個問題。快排的partition函式所完成的功能是將小於pivot的數放在partit...
尋找最大的K個數
方法一 改進的快速排序 分割槽時,根據數p將陣列分為兩部分,設大於p的數個數為a,小於p的數的個數為b。如果,a k,則從這a個數取最大的k個數,若a時間複雜度是o nlogk include includevoid swap float a,float b int fun float n,int ...
尋找最小的k個數
尋找最小的k個數 在乙個長度為n的陣列中,尋找最小的k個數。最大的k個數解法類似 想法比較簡單,先對n個數排序,再輸入前面k個數,即可。這種方法的時間複雜度比較大。假設我們使用快排,需要o nlogn 然後輸出k個數需要o k 一共要o nlogn 略。這種方法比較好,演算法簡單,易於實現。先把陣列...