演算法導論,9 3,最壞情線性時間的選擇演算法

2021-06-22 18:02:58 字數 965 閱讀 5342

演算法的思想是很妙的,發現實現起來有點困難,然後發現網上貌似完整的**沒找見,就自己盡力寫了乙個。

寫完測試了一下,總數組是1乙個數,然後在查詢第i小的數,當i小的時候,隨機線性查詢完爆最壞情況為線性時間的演算法,當i變得很大,執行時間會相對接近。

還有就是陣列下標0開始的特性,感覺會造成很大的不方便,

直接上**了,真的寫了好久:

#include#include#include#include#include#include "mytimer.h"

using namespace std;

void insert_sort2(int shu,int low,int high)

shu[i+1]=key;//此時i上的數可能已經後移,所以需要加1}}

int qpartition( int a, int low, int high,int key )

}return i-low; //由於i從low開始的 返回的是第幾小的,所以要減去low

}int selet_(int a,int low,int high,int m)else //如果整除 就直接分成n/5 ,否則要加上1

if(counts==1)

else//對前面5個數滿的各組進行排序 然後提取出中位數

else // 最後一組的個數可能不滿五個, 特別進行運算

}int mid=selet_(b,0,counts-1,(counts+1)/2);//遞迴執行selet_ 選出b中個中位數的中位數

delete b; //刪除臨時新建的b陣列

int k=qpartition(a,low,high,mid); //利用修改過的劃分函式,取mid為主元 進行劃分 ,mid為第k小的值

if(m==k)return mid; //如果m==k 直接返回

else if(m>shu[i];

}srand(time(null));

cout<

最壞情況為線性時間的選擇演算法

輸入 一系列數a 0 a n 1 和乙個整數k 輸出 這列數中第k小的數 同樣的問題在上篇文章中用快速排序模型,我們得到的平均時間複雜度是o n 但是遺憾的是最壞情況會達到o n 2 這篇文章中我們還是使用快速排序的模型,但是改變了劃分的方式,這個演算法會保準得到乙個很好的劃分。將該演算法叫做sel...

最壞情況為線性時間的選擇演算法

題目 在n個元素的無序陣列中選擇第k 1 k n 小元素。當k 1時,相當於找最小值。當k n時,相當於找最大值。當k n 2時,稱中值。要求 線性時間內完成,即o n 演算法解析 通過執行下列步驟,演算法select可以確定乙個有n 1個不同元素的輸入陣列中第i小的元素。如果n 1,則select...

計數排序(線性時間排序) 演算法導論

之前的排序都是通過比較得到的,即比較排序 在排序的最終結果中,各元素的次序依賴與它們之間的比較。而時間複雜度最好的也是o nlgn 接下來說乙個未經比較的排序,而複雜度則是線性的。計數排序 假設n個輸入元素的每乙個都是在0 k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為o ...