標籤:排序演算法 java 演算法 歸併排序
歸併排序mergesort中基本的操作是合并兩個已排序的表。因為這兩個表已排序,所以若將輸出放到第三個表中,則該演算法可以通過對輸入資料一趟排序完成。基本的合并演算法是取兩個輸入數組A和B,一個輸出數組C,以及3個計數器Actr、Bctr、Cctr,他們初始置於對應數組的開始端。A[Actr]和B[Bctr]中的較小者被拷貝到C的下一個位置,相關的計數器向前推進一步。當兩個輸入表有一個用完的時候,則將另一個表中剩餘部分拷貝到C中。
合并另個已排序的表的時間顯然是線性,因為最多進行N-1次比較,其中N是元素的總數。每次比較都把一個元素添加到C中,除了最後的比較。
歸併排序很容易描述,如果N=1,那麼只有一個元素需要排序,否則遞迴地將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後使用合并演算法再將這兩部分合并到一起。與其它的O(NlogN)排序演算法比較,歸併演算法的已耗用時間嚴重依賴於比較元素和在數組及臨時數組中移動元素的相對開銷。這些開銷是與語言相關的。
以下為歸併排序演算法的實現代碼:
import java.util.Random;public class SortAlgorithm {/** * 歸併排序 * @param array 數組 */public static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] array) {count=0;@SuppressWarnings("unchecked")AnyType[] tmpArray = (AnyType[]) new Comparable[array.length];mergeSort(array, tmpArray, 0, array.length - 1);}/** * 歸併排序遞迴調用的內部方法 * @param array 需要排序的數組 * @param tmpArray 存放歸併結果的數組 * @param left 子數組的最左下標 * @param right 子數組的最右下標 */private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] array, AnyType[] tmpArray, int left, int right) {if (left < right) {int center = (left + right) / 2;mergeSort(array, tmpArray, left, center);mergeSort(array, tmpArray, center + 1, right);merge(array, tmpArray, left, center + 1, right);}}/** * 將兩個子數組歸併的演算法 * @param array 需要排序的數組 * @param tmpArray 存放歸併結果的數組 * @param leftPos 子數組的最左下標 * @param rightPos 子數組後半部分的開始下標 * @param rightEnd 子數組最右下標 */private static <AnyType extends Comparable<? super AnyType>> void merge(AnyType[] array, AnyType[] tmpArray, int leftPos, int rightPos,int rightEnd) {int leftEnd = rightPos - 1;int tmpPos = leftPos;int numElements = rightEnd - leftPos + 1;// 主迴圈while (leftPos <= leftEnd && rightPos <= rightEnd) {if (array[leftPos].compareTo(array[rightPos]) <= 0) {tmpArray[tmpPos++] = array[leftPos++];} else {tmpArray[tmpPos++] = array[rightPos++];}}while (leftPos <= leftEnd) {tmpArray[tmpPos++] = array[leftPos++];}while (rightPos <= rightEnd) {tmpArray[tmpPos++] = array[rightPos++];}//複製tmpArray中內容到arrayfor (int i = 0; i < numElements; i++) {array[rightEnd] = tmpArray[rightEnd];rightEnd--;}}public static void main(String[] args) {Integer[] list1 = new Integer[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };for (int i = 0; i < 10; i++) {System.out.print(list1[i] + " ");}System.out.println();mergeSort(list1);System.out.println("After sorting:");for (Integer integer : list1) {System.out.print(integer + " ");}System.out.println("\n---------------------");Integer[] list2 = new Integer[20];Random random = new Random();for (int i = 0; i < 20; i++) {list2[i] = random.nextInt(20);System.out.print(list2[i] + " ");}System.out.println();mergeSort(list2);System.out.println("After sorting:");for (Integer integer : list2) {System.out.print(integer + " ");}}}
執行結果:
9 8 7 6 5 4 3 2 1 0
After sorting:
0 1 2 3 4 5 6 7 8 9
---------------------
0 6 18 7 18 7 2 0 6 10 9 16 19 10 15 8 3 19 10 18
After sorting:
0 0 2 3 6 6 7 7 8 9 10 10 10 15 16 18 18 18 19 19
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
排序演算法(Java語言)——歸併排序