期望為線性時間的選擇演算法,最壞時間複雜度為:θ(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 ...