尋找第K個數的值

2021-10-18 15:27:18 字數 897 閱讀 7182

題目

以較高的效率求一組無序陣列中按從小到大排序後第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 略。這種方法比較好,演算法簡單,易於實現。先把陣列...