對於歸併排序,我們收到的任務很明確:
就是對一組無序(當然也有可能有序啦)的不明是否有序的資料進行排序,使這組序列實現從小到大的排列順序,這裡給出一組樣例輸入:
8 5 9 2 6 3 7 1 10 4
我們不妨將序列先放入陣列中
#define max 500
int n;
int s[max]
;cin>>n;
//先輸入預處理序列的大小
for(
int i=
0;i)//初始化序列(陣列)
好,預處理完畢!
回到歸併排序上,歸併的思想就是分而治之,用遞迴的方法將對整個陣列排序轉化為對陣列的每個部分進行排序,然後再將他們組合起來
首先,我們將陣列先一分為二,憑藉小學出色的奇偶數知識,我們不難這麼挑選奇偶數:偶數就總長度/2,奇數就(長度+1)/2,
if
(n%2==0
)else
那麼我們只需要在奇數情況下丟掉中間數即可,這樣每次劃分(一分為二)之後,得到的都是長度相等的子問題
但是這樣做,在合併的時候就會很困難了emmm
所以我們必須轉換一下思路
通過犧牲等長的代價,通過(left+right)/2的方法選分界點,
分為[left,mid)和[mid,right)兩部分,這樣不管怎麼樣,每次都能縮小問題的規模,知道最後mergesort只用處理乙個數(ps:left=right),停止分割,
void
mergesort
(int a,
int left,
int right)
}
下面就來考慮合併的問題
void
merge
(int a,
int left,
int mid,
int right)
//此處先跳過不看
r[size_l]
=100
;//分界線
for(
int j =
0; j < size_r; j++
) l[size_r]
=100
;int i =0;
int j =0;
for(
int cnt = left; cnt < right; cnt++
)//對照著拿出來的兩塊分組
//左右比較,乙個個放入
else
}}
ok
這樣我就可以交差了!
那麼,我們為什麼要用歸併排序呢?
那是因為,這樣每次一分為二,規模為n的排序問題
只需要經過log(以2為底)n次就能分割完。
由於每一次的合併(merge)總共需要比較n次
所以總的時間複雜度(所有情況下)均為o(nlgn)
優於快速排序的最壞情況o(n^2)
通俗易懂的講解Softmax
s of tmax softmax softma x是機器學習中很重要的分類函式。通常位於神經網路的最後一層,它的作用是將前面輸出層的資料轉換為概率分布,這個概率分布的特點就是 任意事件發生的概率在0 1之間,且所有事件發生的概率總和為1,並且總有乙個事件會發生。假設原始的神經網路輸出為y1,y2....
通俗易懂 SVM演算法講解 演算法 案例
1.3最大間隔分類器 1.4後續問題 1.5新聞分類例項 尋覓網際網路,少有機器學習通俗易懂之演算法講解 案例等,專案立於這一問題之上,整理乙份基本演算法講解 案例於文件,供大家學習之。通俗易懂之文章亦不可以面概全,但凡有不正確或爭議之處,望告知,自當不吝賜教!github位址 加資料 首先我們先來...
通俗易懂 SVM演算法講解 演算法 案例
新聞分類案例 首先我們先來看乙個3維的平面方程 ax by cz d 0 這就是我們中學所學的,從這個方程我們可以推導出二維空間的一條直線 ax by d 0 那麼,依次類推,更高維的空間叫做乙個超平面 x代表的是乙個向量,接下來我們看下二維空間的幾何表示 svm的目標是找到乙個超平面,這個超平面能...