小白高階之期望為線性時間的選擇演算法

2021-07-13 20:10:43 字數 1204 閱讀 3217

期望為線性時間的選擇演算法,最壞時間複雜度為:θ(n²),期望時間複雜度為:θ(n)。

選擇演算法用到了以前快速排序時用到的隨機劃分。目的是找出陣列中第i個元素。

演算法的思想為:先隨機劃分,再看i的位置,若是i剛剛好等於隨機劃分的位置,則返回此位置的陣列元素值,否則根據i的位置遞迴呼叫選擇函式,尋找第i 個元素。與快速排序不同的是,此演算法只要在一邊遞迴呼叫函式就可以了,而快速排序需要兩邊都進行呼叫。

下面是**:

randomizedselect.h

#include#include#includeint randomizedselect(int *a,int p,int q,int i);

randomizedselect.cpp

#include"randomizedselect.h"

int randomizedpartition(int *a,int p,int q);

int partition(int *a,int p,int q);

int randomizedselect(int *a,int p,int q,int i){

if(p==q)

return a[p];

int r,k;

r=randomizedpartition(a,p,q);

k=r-p+1;

if(i==k)

return a[r];

else if(i

#include"randomizedselect.h"

int main(){

int *a,n,i,k,result;

printf("please input the number of the array:\n");

scanf("%d",&n);

a=(int *)malloc(sizeof(int)*n);

printf("please input the array:\n");

for(i=0;i

此演算法是同時找到最大值和最小值。首先是設定最大值和最小值的初始值,然後對輸入元素成對處理——將一對輸入元素相互比較,然後把較小的值和最小值比較,較大值和最大值比較。這樣每對元素只需要比較三次就可以了。

設定最大值和最小值的初始值的方法也很有趣:設有n個數字,若n為奇數,則最大值和最小值均初始化為第乙個元素;若n為偶數,則比較前兩個,較小的為最小值的初始值,較大的為最大值的初始值。

期望為線性時間選擇演算法

一般選擇問題看起來要比我麼找最小值這樣的簡單問題更難。但這兩個問題的漸進執行時間卻是相同的 n randomized select演算法,以快速排序演算法為模型。與快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而randomized select只處理劃分的一邊。快速排序執行的時間是 n n 而r...

期望為線性時間的選擇演算法

演算法導論 第9章randomized select演算法 從乙個陣列當中尋找第i小的元素,最簡單最暴力的方法就是將整個陣列按照公升序進行排序操作,那麼第i個元素就是第i小的元素。如果是以這種方式,那麼時間複雜度等同於排序時所使用的排序演算法,如果是快速排序,那麼此時時間複雜度為o nlgn 那麼,...

期望線性時間選擇

在乙個由n個元素組成的集合裡,第i個順序統計量 order statistic 是該集合中第i 小的元素。比如 在一組元素的集合中,最小值是第1個順序統計量 i 1 而最大值是第n個順序統計量 i n code include include include void swap int a,int ...