BEPRT演算法的C 實現及詳細解釋

2021-10-24 18:21:58 字數 2254 閱讀 3221

最近上演算法課的時候,聽到了乙個新的演算法beprt演算法,用來尋找陣列中的第k大的元素。本來以為是乙個不重要的演算法,結果去網上搜了一下,發現這個演算法是資料結構十大演算法之一,很重要很重要。所以特地學習了一下,並且自己把這個演算法實現了一下。

#include

using

namespace std;

intinsertsort

(int*,

int,

int)

;int

getpivotindex

(int*,

int,

int)

;int

partition

(int*,

int,

int,

int)

;int

beprt

(int*,

int,

int,

int)

;void

swap

(int&,

int&);

intinsertsort

(int

* input,

int left,

int right)

*(input+index+1)

=temp;

} ans=

(left+right)/2

;return ans;

}int

getpivotindex

(int

* input,

int left,

int right)

return

beprt

(input,left,resultindex-1,

(left+resultindex-1)

/2+1

);}int

partition

(int

* input,

int left,

int right,

int mid)

swap(*

(input+leftindex),*

(input+right));

return leftindex;

}int

beprt

(int

* input,

int left,

int right,

int k)

void

swap

(int

& a,

int& b)

intmain()

;int

* input=

&data[0]

; cout<<

*(input+

beprt

(input,0,

15,5)

)<;return0;

}

insertsort函式用來找到當前陣列input的left位置到right位置之間的中位數。這是完全用插入排序做的,**和插入排序的**完全一樣。insertsort函式其實就是先排序,再找到最中間位置(left+right)/2,作為返回值,作為中位數的下標。注意這個函式得到的是長度為5的陣列部分的中位數

getpivotindex是得到當前陣列input的left位置到right位置之間的中位數,這個函式需要多次呼叫insertsort函式來多次找中位數的位置,再把得到的多個中位數重新呼叫bfprt函式,從而找到最終的中位數(因為前面說到,insertsort只處理長度為5的陣列,所以需要用這個getpivotindex處理更長的陣列)。

partition函式是基於前面的getpivotindex得到的中位數的下標,來把陣列input的left位置到right位置之間的資料進行處理,把大於中位數的數字都放右邊,小於的都放左邊(用乙個迴圈就可以實現)。

beprt函式是最終的返回第k大的元素的函式,會呼叫上面的幾個函式。在這個函式中每次都判斷當前的返回值是不是k(是k就表明已經找到了第k大元素)。

我剛開始的時候在想,為什麼getpivotindex函式中,找多個中位數的中位數是呼叫了beprt函式而不是insertsort函式,因為insertsort函式也可以找到中位數。後來仔細想了想,insertsort之所以只處理長度較小的陣列,就是因為插入排序的時間複雜度很高,是o(n

2n^2

n2),而bfprt演算法的時間複雜度是o(n),所以應該呼叫bfprt函式。

還要注意一下,上面所有的函式返回的值都是陣列中的某乙個下標(比如中位數的下標等),而不是具體的值(我這裡剛開始沒有理解到位,剛開始寫錯了)

KMP演算法詳細介紹及Java實現

kmp是三位大牛 d.e.knuth j.h.morris和v.r.pratt同時發現的。其中第一位就是 計算機程式設計藝術 神作的作者。kmp演算法要解決的問題就是在字串 也叫主串 中的模式 pattern 定位問題。說簡單點就是我們平時常說的關鍵字搜尋。模式串就是關鍵字 接下來稱它為p 如果它在...

C演算法精解 集合 實現和分析

將乙個成員插入到集合中,由於集合中的成員只能出現一次,因此將首先呼叫set is member以確保集合中不會已經包含了待插入的成員 若集合中不存在待插入的成員,就呼叫list ins next將待插入的成員插入到集合中 set inert的複雜度為o n 級,因為set is member需要遍歷...

排序演算法分析及實現C

參考資料 經典排序演算法過程 經典排序演算法性質 王道資料結構 嚴蔚敏 資料結構 穩定 如果a原本在b前面,而a b,排序之後a仍然在b的前面。不穩定 如果a原本在b的前面,而a b,排序之後 a 可能會出現在 b 的後面。時間複雜度 對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。...