演算法的思想是很妙的,發現實現起來有點困難,然後發現網上貌似完整的**沒找見,就自己盡力寫了乙個。
寫完測試了一下,總數組是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 ...