排序 歸併排序

2021-07-22 12:44:21 字數 1549 閱讀 7774

概述

歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

基本思想

將待排序序列r[0...n-1]看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n/2個長度為2的有序表;將這些有序序列再次歸併,得到n/4個長度為4的有序序列;如此反覆進行下去,最後得到乙個長度為n的有序序列。

綜上可知

歸併排序其實要做兩件事:

(1)「分解」

——將序列每次折半劃分。

(2)「合併」

——將劃分後的序列段兩兩合併後排序。

以公升序為例:

我們先來考慮第二步,如何合併

在每次合併過程中,都是對兩個有序的序列段進行合併,然後排序。

這兩個有序序列段分別為 r[low, mid] 和 r[mid+1, high]。

先將他們合併到乙個區域性的暫存陣列r2中,帶合併完成後再將r2複製回r中。

為了方便描述,我們稱 r[low, mid] 第一段,r[mid+1, high] 為第二段。

每次從兩個段中取出乙個記錄進行關鍵字的比較,將較小者放入r2中。

最後將各段中餘下的部分直接複製到r2中。

經過這樣的過程,r2已經是乙個有序的序列,再將其複製回r中,一次合併排序就完成了。

那有如何合併呢?

首先把兩個區間資料比較 , 利用乙個外部空間dst(我在實現的時候是new了一段空間),每次將兩段區間中較小的數存入dst , 依次類推:

**如下:

//歸併排序

void _merge(int arr, int dst, int left, int mid, int right)// 合併

while (begin1 < end1)

dst[index++] = arr[begin1++];

while (begin2 < end2)

dst[index++] = arr[begin2++];

//放回資料

int i = 0;

while (i < index) }

void __mergesort(int arr, int dst, int left, int right)//[ , )

}void mergesort(int arr, int size)

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...

排序 歸併排序

利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...