快速排序 快排求第K大

2021-08-20 18:47:57 字數 1212 閱讀 2745

快速排序:快排採用分治的策略,先從數列中取出乙個元素作為作為基準元素,以基準元素為標準,將問題分解為兩個子串行,使小於基準的子串行在左側,使大於等於基準元素的子串行右側,對兩個子串行再進行快速排序,最終得到排好序的序列。

時間複雜度:o(nlogn) ,空間複雜度o(logn) ,快速排序是不穩定的

code:

#include#include#include#includeusing namespace std;

int a[100],n;

int solve(int l,int r)//取序列的第乙個數為基準元素

swap(a[i-1],a[l]);//

return i-1;//返回基準元素的位置

}void qsort(int l,int r)//遞迴實現

/*void qsort(int l,int r)//非遞迴實現

}}*/

int main()

qsort(1,n);

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

}

快排求第k大:利用快速排序的特點,第一遍排序會確定乙個基數的位置,這個數左邊都比它小,右邊都比他大,當右邊區間大於k時,說明我們求的第k大數在右邊區間,這時我們可以捨棄左邊區間,將範圍縮小到右邊區間從而重複上述過程,直到確定乙個數的位置時,這個數右邊區間數的個數是k-1,那麼這個數字就是我們所求。反之亦然。(如果序列中有重複的數字,看題目具體要求判斷用不用去重)

時間複雜度:o(n)

code:

#include#include#includeusing namespace std;

int n,k;

int a[100];

int solve(int l,int r)

swap(a[i-1],a[l]);

return i-1;

}//void qsort(int l,int r)//遞迴

//// if(r>mid&&midn-k+1) qsort(l,mid-1);

//}void qsort(int l,int r)//非遞迴

}int main()

qsort(1,n);

printf("%d\n",a[n-k+1]);}/*

4 31 3 4 2

*/

可以從大到小排序,直接找第k個位置上的數就可以。

尋找第K大的數(快排思想)

使用快排思想找第k大的數,演算法複雜度o n 1.以陣列a的第0位a 0 為參考基準base,將陣列劃分為兩個部分 如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準b...

演算法 快速排序 經典快排 隨機快排

經典快排的思路是選取陣列的最後乙個數 x,按照問題一的思路把整個陣列劃分成小於等於 x 大於 x兩個部分,將 x 和 大於 x 部分陣列的第乙個元素交換位置。此時整個陣列劃分成小於等於 x x 大於 x三個部分,也就是這一次排序將 x 值排好位置。再分別對小於等於 x和大於 x中的陣列遞迴劃分,直到...

快排的思想求第K小的數

描述輸入n 個數,m 次查詢。每次查詢給出乙個數x。要求 每次查詢輸出前 x個數中第 i小的數。i為第 i次查詢 你可以假設 m n xi xi 1 xi 2 xm xm n 輸入 line0 t line1 n,m line2 linen 1 num1,numn linen 2 linen 2 m...