歸併排序(分治思想的運用)
原理:將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序的子串行合併為整天有序序列。
分治演算法步驟:
第一步:劃分。將原問題劃分為幾個子問題
第二步:遞迴求解。遞迴求解每個子問題
第三步:合併。將求解後的子問題合併成原問題
**實現(遞迴):
void mergesort(intarr)
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(intarr)
//當前的歸併的子串行長度為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 分解 將...