題目:
求一組整數的第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...