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

2021-07-11 05:41:59 字數 1130 閱讀 6964

使用快排思想找第k大的數,演算法複雜度o(n)。

1.以陣列a的第0位a[0]為參考基準base,將陣列劃分為兩個部分;

如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。

劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準base的大小交替移動兩個指標,直到兩個指標指向同乙個位置i==j,此時i或j即為base的下標.

2.當k-1大於base的索引i(或j)時,所要找的第k大的數字於base的後半部分,需要對後半部分進行排序,而不用管前半部分的順序;

當k-1小於base的索引時,所要找的第k大的數字於base的前半部分,只需要對前半部分進行排序;

當k-1等於base的索引時,說明當前的base就是所要找的第k大的數。

使用遞迴方法對所需要排序的部分進行排序。

#include 

#include

using

namespace

std;

// 找第k小的數

void findkthsmaller(vector

&a, int k, int m,int n)

if(a[j]while(iif(a[i]>=base)

}a[i]=base;

if(k-1

1); }

else

if(k-1>i)

else

return;

}// 找第k大的數

// m,n表示所需要排序部分的首尾索引

void findkthbigger(vector

&a, int k, int m,int n)

if(iif(k-1 > i)

if(k-1

< i)

else

return;

}int main()

findkthbigger(a,k,0,n-1);

for(int i=0;icout

<" ";

}cout

<< endl;

cout

<< a[k-1] << endl;

return

0;}

快排的思想求第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...

尋找第K大的數

題目描述 要求在n個不重複的整數中,找出第k大的整數 其中0輸入第一行為兩個正整數n k 第二行為n個整數,輸入保證這n個整數兩兩相異,每個整數的範圍在 1000000到1000000之間 輸出輸出第k大的整數值 樣例輸入 5 33 2 4 5 1 樣例輸出 3 如下 include include...

尋找第K大的數

在一堆資料中查詢到第k個大的值。名稱是 設計一組n個數,確定其中第k個最大值,這是乙個選擇問題,解決這個問題的方法很多。所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找出從大到小順序的第 前 k個數的問題。解法1 我們可以對這個亂序陣列按照從大到小先行排序,然後取出前k大,總的時...