快速排序 第K大 第K小的問題

2021-09-12 23:13:38 字數 1657 閱讀 3074

這裡的快排 是一種稍微改進的快排,即減少一些不必要的交換次數。

quick_sort:

void quick_sort(int s, int e)

a[s] = a[i]; //此時 i == j 為最後找到的最小的數,需要放在樞軸處(即位置s)

a[i] = x;

quick_sort(s,i-1);

quick_sort(i+1,e);

}

第k小

int kth_min(int s, int e, int k)

a[s] = a[i];

a[i] = x;

if(i-s+1 == k)

return a[i];

else if(i-s+1 < k)

kth_min(i+1,e,k-(i-s+1));

else

kth_min(s,i-1,k);

} }

第k大

int kth_max(int s,int e, int k)

a[s] = a[i];

a[i] = x;

if(e-i+1 == k)

return a[i];

else if(e-i+1 < k)

kth_max(s,i-1,k-(e-i+1));

else

kth_max(i+1,e,k);

}}

完整code:

#includeusing namespace std;

int a[100];

void quick_sort(int s, int e)

a[s] = a[i];

a[i] = x;

quick_sort(s,i-1);

quick_sort(i+1,e);

}int kth_min(int s, int e, int k)

a[s] = a[i];

a[i] = x;

if(i-s+1 == k)

return a[i];

else if(i-s+1 < k)

kth_min(i+1,e,k-(i-s+1));

else

kth_min(s,i-1,k);

} }int kth_max(int s,int e, int k)

a[s] = a[i];

a[i] = x;

if(e-i+1 == k)

return a[i];

else if(e-i+1 < k)

kth_max(s,i-1,k-(e-i+1));

else

kth_max(i+1,e,k); }}

int main()

quick_sort(0,n-1);

for(int i = 0; i < n; ++i)

cout << a[i] << " ";

cout << endl;

cout << kth_min(0,n-1,3) << endl;

cout << kth_max(0,n-1,3) << endl;

return 0;

}

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

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

第K個數 快速排序

題目描述 description 給定乙個長度為n 0輸入描述 input description 第一行為2個數n,k 含義如上題 第二行為n個數,表示這個序列 輸出描述 output description 如果m為質數則 第一行為 yes 沒有引號 第二行為這個數m 否則 第一行為 no 第二...

快速排序 快排求第K大

快速排序 快排採用分治的策略,先從數列中取出乙個元素作為作為基準元素,以基準元素為標準,將問題分解為兩個子串行,使小於基準的子串行在左側,使大於等於基準元素的子串行右側,對兩個子串行再進行快速排序,最終得到排好序的序列。時間複雜度 o nlogn 空間複雜度o logn 快速排序是不穩定的 code...