最近上演算法課的時候,聽到了乙個新的演算法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變化時,操作次數呈現什麼規律。...