今天是釋然發題解的第十三天,以後每一天都會和大家分享學習路上的心得,希望和大家一起進步,一起享受coding的樂趣。
本文約1200字,預計閱讀4分鐘
昨天我們學習了深度優先搜尋和廣度優先搜尋,忘記的小夥伴們可以看一下哦:
**bfs與dfs區別+模板
舉乙個例子
歸併排序
快速排序
分治,字面上的解釋是「分而治之」,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。在電腦科學中,分治法就是運用分治思想的一種很重要的演算法。分治法是很多高效演算法的基礎,如排序演算法(快速排序,歸併排序),傅利葉變換(快速傅利葉變換)等等。我們再來舉乙個例子,比如說有一堆硬幣,但是當中呢有一枚假幣(假設假幣比真幣要輕,且重量相差不大),我們有乙個天平,我們可以每次二分稱量硬幣的重量,每次稱量時有假幣的那一堆要輕一些,最後那枚假幣就水落石出了,這是理想化最快的解決問題的方法
上面的這個思想利用的就是分治演算法
分治演算法裡面重要的乙個應用就是歸併排序:
又分為:歸併和排序(遞迴的思想)
歸併就是把有序的兩個陣列合併到乙個有序的陣列裡面,比如說兩個班的同學的成績是有序的,但是現在我們要看整體的排名情況,就需要對兩個班同學的成績進行合併,這就是歸併
歸併排序其實是一種遞迴式的呼叫歸併排序函式並且合併的過程,因此**如下
//此時a陣列從i到j是有序的,j到k這一段也是有序的
void
merge
(int a,
int i,
int j,
int k,
int tem)
else tem[pos++
]=a[right++]}
while
(left<=j)
tem[pos++
]=a[left++];
while
(right<=k)
tem[pos++
]=a[right++];
for(
int t=
0;t1;t++
)}
接下來是遞迴分治排序的方法:
void
mergesort
(int a,
int l,
int r,
int tem)
}
對於這個方法,時間複雜度為:o(nlogn),害我也不太會證明,但是我是這樣想的:每次都需要對半進行歸排,因此應該是指數級別的降低,所以應該是nlogn的這種形式
空間複雜度為o(n),非原地排序(因為需要用臨時陣列來儲存,所以空間複雜度為n),穩定排序(如果a=b,在排序之後a依然在b的前面)
好了,今天的有關歸併排序的題目就到這裡
釋然每天發布一點自己學習的知識,希望2年後我們也能在acm的賽場上見面,一起去追尋自己的程式猿之路吧!
後期也會和大家一起分享學習心得和學習經驗呢,明天我們不見不散哦!
下期預告:
第十三天 練兵
問 昨天您講的很驚心動魄。這樣快節奏的配合確實非常完美,很羨慕。但要形成這樣的結果必須我們之間配合需要非常流暢,我們有什麼方法可以促成這樣的氛圍?答 練兵。如果一開始就進入業務系統功能的設計開發,業務組長對業務還沒有很深的吃透,這樣倉促上陣功能不但連上一版不如,而且為了補課,軟體不斷修改,什麼都亂了...
2020 7 18第十三天
1.學習了static關鍵字 靜態變數,靜態方法以及靜態模組 1 public class vardemo 9 1 public class staticblockdemo 5public staticblockdemo 8public static void main string args 12...
android基礎 第十三天
可航訓練營 為幫助大家更好的 系統性的學習 android 一 progressbar頁面進度提示 密碼 9ewc 二 fragment優化選項卡切換 密碼 gvsb 三 fragment和activity進行通訊 密碼 45u2 四 xlistview上拉重新整理 密碼 na6r 五 提示對話方塊...