資料結構與演算法之排序演算法(四) 歸併排序

2022-08-28 21:27:35 字數 1414 閱讀 1152

歸併排序(分治思想的運用)

原理:將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序的子串行合併為整天有序序列。

分治演算法步驟:

第一步:劃分。將原問題劃分為幾個子問題

第二步:遞迴求解。遞迴求解每個子問題

第三步:合併。將求解後的子問題合併成原問題

**實現(遞迴):

void mergesort(int

arr)

void sort(int arr, int left, int

right)

//找出中間索引

int middle = left + (right - left) / 2;

//對左邊陣列進行排序

sort(arr,left,middle);

////

對右邊陣列進行排序

sort(arr,middle + 1,right);

//合併

merge(arr,left,middle,right);

print(arr);}/*

將兩個陣列進行歸併,歸併前兩個陣列有序,歸併後依然有序

引數列表:arr:陣列物件。left:左陣列的第乙個元素索引。middle:左陣列的最後乙個元素索引。right:右陣列的最後乙個元素索引

*/void merge(int arr, int left, int middle, int

right)

else

}//剩餘部分依次放入臨時陣列

while(left <=middle)

while(rightfirst <=right)

//將臨時陣列的內容拷貝回原陣列中

while(tmp <=right)

}void print(int

arr)

}

分析:演算法穩定,空間複雜度【陣列o(n+logn)logn為遞迴時使用的深度為logn的棧空間,鍊錶o(logn)】,時間複雜度【最好、平均、最壞均為o(nlogn)】

**實現(非遞迴):

void mergesortnonrecursive(int

arr)

//當前的歸併的子串行長度為1

int len = 1;

while(len <=arr.length)

//merge參考遞迴排序的merge

merge(arr,left,mid,right);

}len *= 2;

}return

;}

分析:在空間上避免了遞迴時使用的深度為o(logn)的棧空間,在時間上,避免了遞迴,在時間上也有所提公升。

《資料結構與演算法》之排序演算法(歸併排序)

5 歸併排序 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。...

資料結構與演算法之歸併排序

歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併過程為 比...

資料結構與演算法之PHP排序演算法(歸併排序)

一 基本思想 歸併排序演算法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。二 演算法過程 歸併主要做兩件事 1 分解 將...