6陣列排序的方法 經典排序 歸併排序

2021-10-16 09:43:32 字數 3188 閱讀 7894

歸併排序的原理

歸併排序是利用歸併的思想實現的排序方法,該方法採用經典的分治策略(分治法將問題分成一些小的問題然後遞迴求解,而治的階段則是將分的階段得到的答案修補在一起,即分而治之)。

**歸併排序

下面我們以待排序陣列 8,4,5,7,1,3,6,2,9,10為例,以**的方式講解歸併排序的原理。

(1)分治原理圖(由於太大,沒法截全,我進行了一定壓縮,所以看起來有點奇怪...)

從圖中可以看出,歸併排序是先將陣列進行拆分,拆分到剩餘乙個關鍵字,這是乙個從大到小的過程。然後再進行治理,治理的過程也就是進行合併的過程,合併時會保證左右兩邊的陣列內部各自有序。然後將兩個有序的陣列合併到乙個陣列中,且合併後的陣列有序。總結就是:遞迴拆分,回溯合併,合併時左右兩個陣列內部有序。

(2)遞迴原理圖

在看遞迴原理圖前,我們先看下歸併排序的**,如下所示

1 public class mergesort ; 5 int temp = new int[arr.length]; 6 split(arr, 0, arr.length - 1, temp); 7 system.out.println(arrays.tostring(arr)); 8 } 9 10 /**11 * 遞迴拆分陣列然後合併12 *13 * @param arr 待拆分陣列14 * @param left 陣列左邊下標15 * @param right 陣列右下標16 * @param temp 用於存放合併後的有序序列的陣列17 */18 public static void split(int arr, int left, int right, int temp) 22 system.out.println("拆分第"+(count++)+"次");23 int mid = left + (right - left) / 2;24 //向左拆分25 split(arr, left, mid, temp);26 //向右拆分27 split(arr, mid + 1, right, temp);28 //每次拆分後都執行合併29 merge(arr, left, mid, right, temp);30 }31 32 /**33 * 合併兩個各自有序序列(以mid為界)34 *35 * @param arr 原始陣列36 * @param left 陣列左邊下標37 * @param mid 陣列中間下標38 * @param right 陣列右邊下標39 * @param temp 用於存放新的有序陣列40 */41 public static void merge(int arr, int left, int mid, int right, int temp)  else 58 t++;59 }60 //有一邊已經全部複製到temp中了61 if (i <= mid) 68 } else if (j <= right) 75 }76 //將temp複製到原arr中77 t = 0;78 while (left <= right) 83 }84 }

我們都知道在jvm記憶體模型中,執行緒每呼叫乙個方法就會將該方法壓入本執行緒的棧中。在遞迴方法的呼叫過程中也是如此,只不過每次壓棧的方法名都相同,這裡我們為了好區分遞迴執行到哪一層,人為的為遞迴方法編號,即每遞迴一次編號加1。如上圖所示,陣列8,4,5,7,1,3,6,2,9,10第一次拆分時,left = 0,right=9,mid=4 (三者均表示下標),然後繼續向左遞迴拆分即split1方法入棧,此時left=0,right=4,mid=2。然後繼續向左遞迴拆分。。。。直到left=right即只剩下乙個數字無法再拆分,即我們上圖中的split4,所以split4方法出棧回溯到方法split3中,split3**向下執行,執行向右遞迴拆分,這裡我們為了方便區分,將向右遞迴的過程又畫了乙個棧來表示,即上圖中間的棧圖,此時向右遞迴的split0入棧,此時left=right=1,split0出棧,split3繼續向下執行,即執行merge合併方法,此時合併方法引數left=0,right=1,mid=0,即8和4兩個分別有序的陣列進行合併(單個數字內部當然有序)。

merge方法執行完後,split3遞迴方法執行完畢,出棧,回溯到遞迴方法split2中,繼續執行上述步驟。需要說明的是,上述過程在向右遞迴時由於mid後面只有乙個數字4,所以left=right=1,所以向右遞迴方法直接出棧,而在向左遞迴執行到split1時,mid後面有兩個數字7,1所以在向右遞迴時會將當前陣列(7,1)繼續執行向左向右拆分,以保證陣列與其他陣列進行合併前內部有序。

(3)合併**

下面以最後一次合併為例,**合併的執行過程。即1,4,5,7,8與2,3,6,9,10兩個有序陣列的合併過程

(4)總結

以上就是歸併排序的執行原理,主要分為以下步驟:

1.遞迴的方式進行拆分,將大的陣列拆分成小的陣列,直到剩餘乙個不能拆分

2.回溯的時候進行合併,合併時以mid為界,左右兩邊各自有序,通過額外的空間temp陣列,將兩個有序陣列合併到乙個有序陣列中

3.將合併後的陣列複製到原陣列中,當回溯完成時整個陣列有序

經典排序 歸併排序

歸併排序是利用歸併的思想實現的排序方法,該方法採用經典的分治策略 分治法將問題分成一些小的問題然後遞迴求解,而治的階段則是將分的階段得到的答案修補在一起,即分而治之 下面我們以待排序陣列 8,4,5,7,1,3,6,2,9,10為例,以 的方式講解歸併排序的原理。從圖中可以看出,歸併排序是先將陣列進...

排序 6 歸併排序

參考 排序 0 前言 將序列分為若干個子串行 子串行均有序 兩兩子串行進行歸併操作,得到乙個新的有序列表,最終歸併所有子串行,得到乙個遞增或遞減的序列 從左到右逐個比較兩個子串行中的元素大小,比如進行遞增排序,將較小的元素加入結果序列中,其下標加1,繼續和另乙個序列元素進行比較,直到某乙個序列元素已...

6 歸併排序

歸併排序是歸併兩個有序的序列,這兩個有序序列需要頭尾兩個指標,遍歷這兩個序列,按照排序規則儲存在乙個可以容納這兩個序列的序列中,當遍歷結束,則新的序列為有序序列。當我們需要對某一串行排序時,可以把該序列分成兩半,分別對這兩半進行排序,然後歸併這兩個有序序列。而這兩半又可以遞迴地分半,類似二分法。in...