求一組整數的第k小的數

2021-07-12 08:04:19 字數 1297 閱讀 8214

題目:

求一組整數的第k小的數

輸入:5 2

10 60 4 2 7

輸出: 4

解題思路:

1、使用快速排序的思路解題。

2、與快排不同的是,快排會在排序結束才會結束。此題也是從小到大排序,但是,只要找到第k小的數,就跳出遞迴。

3、此題有一些小地方可以優化容易忽略,比如判斷k是否會大於n,判斷用i和j掃瞄時是否會越界,交換時是否會自己與自己交換等等。

快排基本思想:

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

了解快排可看此篇文章:快速排序詳解

**:

#includeusing namespace std;

//返回陣列中的第k個最小元素的啟動函式,注意會破壞原陣列

int findmin(int *x, int x_size, int k);

//實現查詢陣列中第k個最小元的功能函式

int kmin(int *x, int left, int right, int k);

void swap(int *x,int i,int j);

int main()

cout//從後向前掃瞄,防止陣列越界

//此時不用檢查下標,因為第乙個數為參照值

while(x[i] < centre && i<=right)

++i;

while(x[j] > centre)

--j;

//如果沒有完成,就交換

if(i < j)

swap(x,i,j );

else

break;

}//把參考數值放在正確的位置

swap(x,left,i);

//由於我們是從小到大排序的

//如果此時centre的位置剛好為k,則centre為第k個最小的數

//如果此時centre的位置比k前,遞迴地在其右邊尋找

//如果此時centre的位置比k後,遞迴地在其左邊尋找

if(i+1 == k)

return x[i];

else if(i+1 < k)

kmin(x, i+1, right, k);

else

kmin(x, left, i-1, k);

}void swap(int *x,int i,int j)

求一組數中的第K大數,採用遞迴方法

參考陳越的 資料結構 用遞迴的方法實現尋找一組數中的第k大數。使用了動態陣列和清屏函式。如下 include include name 找第k大數 author demosees date 23 03 17 19 35 description 找一組數中的第k大,採用遞迴的方法解決。void swa...

求一組數的所有組合。

例如1 2 3的所有組合數,有1 2 3 12 13 23 123共7中。演算法思路 n個數能夠構成長度為1的組合 長度為2的組合 長度為n的組合。在求n個數的長度為m m 1 m n 的組合時,我們把這n個數分成兩部分 第乙個數和其餘的所有數。如果組合裡包含第乙個數,則下一步在剩餘的數中選取m 1...

快速排序(求第k小的數)

快排是利用的partition演算法,基本思想是從第乙個數開始,利用partition演算法將這個數在有序序列中的位置找到,這個數的左邊部分都是小於它的數,右邊部分都是大於他的數,然後通過分治的方法對左右兩個區間再進行partition操作,partition演算法 如下 int partition...