歸併排序實現c 版

2021-08-21 20:34:45 字數 1298 閱讀 3781

歸併排序利用了遞迴的思想(而是分而治之的思想),將陣列一分為二,先將左半部分(座標為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 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。演算法描...