歸併排序利用了遞迴的思想(而是分而治之的思想),將陣列一分為二,先將左半部分(座標為0~mid)排好序,再將右半部分排好序(都是呼叫函式),最後將兩部分合併起來。整體演算法時間複雜度為o(nlogn),空間複雜度為o(n)。
#includeusing namespace std;
//歸併過程
void merge(int arr, int l, int mid, int r)
//左邊和右邊肯定有一邊到頭了,不可能同時,因為每次只移動一邊
while(lindex <= mid)
while(rindex <= r)
//將排好序的輔助陣列賦值給原始陣列,不需要返回值
for(i = 0; i < r-l+1; i++)
}//遞迴
static void mergesort(int arr, int l, int r)
int mid = (l + r) / 2;
//左半部分歸併排序
mergesort(arr, l, mid);
//右半部分歸併排序
mergesort(arr, mid+1, r);
//左右部分歸併
merge(arr, l, mid, r);
}//歸併排序整個陣列
void mergesort(int arr, int n)
mergesort(arr,0,n-1);
}int main()
cout << endl;
} return 0;
}
遞迴過程就是系統輔助你壓棧的過程,保護好現場,以後好繼續。
乙個函式呼叫過程之前,會把自己的所有資訊全部壓入棧中,保留現場,子過程返回以後會利用這些資訊徹底還原現場繼續跑,跑完之後再從棧中拿出乙個函式再還原現場,最終串起來所有子過程和父過程。
遞迴過程分析時間複雜度:(看是否滿足master方程)
t(n) = at(n/b) + o(n^d)
n是原始問題的樣本量,a是子過程的發生次數,n/b是子過程的樣本量,o(n^d)是除子過程呼叫外剩下的過程。
log(b,a) > d ----------> o(n^log(b,a))
log(b,a) = d ----------> o(n^d*logn)
log(b,a) < d -----------> o(n^d)
感謝左神的講解,終於記住了遞迴排序的具體實現步驟!!自己實現的過程中發現一些細節需要注意,不然總是出錯,尤其是要注意邊界。遞迴的思想左神也講得超棒!為左神打**!(人還帥哈哈哈)繼續加油吧ヾ(◍°∇°◍)ノ゙
C 版歸併排序
class program listy x.tolist listtogether mergesort y console.writeline console.write 排序後為 together.foreach int ele console.writeline console.readkey ...
歸併排序 C 實現
歸併排序跟快速排序一樣,也是基於 分治法 歸併排序與快速排序的區別 快速排序是先 分治 成兩個子串行,然後呼叫本身繼續遞迴進行 分治 歸併排序是先遞迴地分成子串行,然後按演算法合併。歸併排序是先遞迴地把待排序序列分成若干子串行,直到最後分成乙個乙個元素為子串行,然後對些子串行中每個元素,依照其大小合...
C 實現歸併排序
歸併 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。演算法描...