排序 歸併排序

2021-06-09 00:36:15 字數 1417 閱讀 9752

歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併:將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點:只有乙個元素的集合是已經排好序的集合。歸併排序是建立在歸併操作上的一種有效的排序演算法。歸併排序演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

歸併排序流程:

1.對任意的元素數目為m集合,可以分成m個只有乙個元素的子集合。

2.對其m個元素只有乙個的集合實現歸併操作,可以得到[m/2]個新的子集合([如果m不是偶數],細節問題,多出的單獨保留,即存有[m/2 + 1]個集合),關鍵的是這些新的集合也是有序的。

3.重複2的操作,直至最後只有乙個集合。

由於各子集合始終保持有序,最終的集合也是有序的,也就得到了排序後的集合,演算法目的實現。

在這裡,我們不是用遞迴來實現。按照思想,歸併排序的實現**如下:

//歸併排序

public static void mergesort(int array)

}

//對子陣列進行的排序操作

public static void mergepass(int array, int temp, int size)

//餘下元素,細節處理

if ((index + size) < array.length)

else

}}

//歸併操作

public static void merge(int array, int temp,

int left, int middle, int right)

else

if (i > middle)

break;

}if (j > right)

break;}}

}

歸併排序的特點在於沒有如同

冒泡、選擇、

快速排序的那種元素間的交換,故歸併排序是一種穩定的排序演算法,簡言之就是相等的元素的順序不會發生改變(當然,具體演算法設計細節上可能會出現變換的情況),

這對要排序資料報含多個資訊而要按其中的某乙個資訊排序,要求其它資訊盡量按輸入的順序排列時很重要。這也是她比下面介紹的快速排序所具有的優勢。不過,由於開闢了新的同等大小臨時陣列,會占用很多資源是其缺陷。

歸併排序的實現種類有很多,並不僅僅侷限於本文的演算法設計,要想對歸併排序有更加深入的了解,讀者還要花費很大的心思去查閱資料。

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

2-路歸併。本文演算法設計即為

2-路歸併。

| |如果您有疑問,請到

論壇討論!

排序 歸併排序

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

排序 歸併排序

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

排序 歸併排序

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