求第k小元素的快速排序演算法

2021-08-14 14:58:29 字數 2146 閱讀 6763

/*

name: 第k小元素

author:

date: 13-04-17 15:28

description: 求一列數中的第k小元素,利用分治的策略進行遞迴求解。

模仿快速排序法的思路,只不過每次只遞迴處理第k小元素所在的序列。

使用消除尾遞迴優化後效果更好。

*/#include#include#include#includeusing namespace std;

const int n = 6000000;

int a[n] = ;

int b1[n] = ;

int b2[n] = ;

int b3[n] = ;

int b4[n] = ;

int b5[n] = ;

int b6[n] = ;

int selectk_1(int a, int low, int high, int k);

int selectk_12(int a, int low, int high, int k);

int selectk_2(int a, int low, int high, int k);

int selectk_22(int a, int low, int high, int k);

int selectk_3(int a, int low, int high, int k);

int selectk_32(int a, int low, int high, int k);

int partition(int a, int low, int high);

int selectk(int a, int low, int high, int k);

int main()

int selectk_12(int a, int low, int high, int k)

}int selectk_2(int a, int low, int high, int k)

swap(a[low], a[j]);

if (j == k)

return a[j];

else if (j > k)

return selectk_2(a, low, j-1, k);

else

return selectk_2(a, i, high, k);

}int selectk_22(int a, int low, int high, int k)

swap(a[low], a[j]);

if (j == k)

return a[j];

else if (j > k)

high = j - 1; //消除尾遞迴selectk_2(a, low, j-1, k);

else

low = i; //消除尾遞迴selectk_2(a, i, high, k); }}

int selectk_3(int a, int low, int high, int k)

swap(a[low], a[j]);

if (j <= k && k < i)

return a[j];

else if (j > k)

return selectk_3(a, low, j-1, k);

else

return selectk_3(a, i, high, k);

}int selectk_32(int a, int low, int high, int k)

swap(a[low], a[j]);

if (j <= k && k < i)

return a[j];

else if (j > k)

high = j - 1; //消除尾遞迴selectk_3(a, low, j-1, k);

else

low = i; //消除尾遞迴selectk_3(a, i, high, k); }}

int selectk(int a, int low, int high, int k)

int partition(int a, int low, int high)

swap(a[low], a[j]); //把樞紐元素置換到它該處的位置

return j;

}

分治演算法求第k小元素

1.問題 用分治的演算法求乙個陣列s n 中第k小的元素。2.解析 採取和快速演算法相同的思路,但是結合分治的思想,選取恰當的基準值。找到基準值以後,再按照快速排序的方法進行查詢就好了。3.設計 int r 5int r group ceil high low 1 1.0 r ceil取上限,總共分...

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

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

求第k小元素

題目 給定線性序集中n個元素和乙個整數k,其中1 k n,要求找出這n個元素中第k小的元素。如果將這n個元素線性序排列時,如果不存在重複的數或者求第k個元素的時候,那麼第k個位置即為要找的元素。當k 1時,要找的就是最小值 而當k n時,則要找的則是最大值。憑藉著快速排序中的劃分函式,可以實現上面的...