標籤:
/* 本例擬在實現排序演算法的歸併演算法,歸併演算法遵循分治法的思想 歸併演算法: 歸併演算法主要用來合并兩個已經排好序的序列。用Merge(A,p,q,r)來實現合并, 其中A代表數組,A[p,q]和A[q+1,r]A的兩個子數組,且兩個數組都已經排好序,歸併演算法 就是將這兩個子數組合并成一個排好序的數組並替代當前的數組A[p,r]。*/public class Merge{ public static void main(String[] args) { int[] a = {1,2,3,4,5,7,9,11,6,8,10,12,13,14,15,16}; merge(a,4,7,11); for(int i=0; i<a.length; i++) { System.out.print(a[i]); } } public static int[] merge(int[] a, int leftStart, int leftEnd, int rightEnd) { int left_length = leftEnd - leftStart + 1; //左數組的長度 int right_length = rightEnd - leftEnd; //右數組的長度 int[] left = new int[left_length + 1]; //構建左數組的副本,長度加1,用來存放標誌牌 int[] right = new int[right_length + 1]; //構建右數組的副本,長度加1,用來存放標誌牌 for(int i=0; i<left_length; i++) { left[i] = a[leftStart + i]; //往左數組的副本裡拷貝資料 } for(int i=0; i<right_length; i++) { right[i] = a[leftEnd + i + 1]; //往右數組的副本裡拷貝資料 } left[left_length ] = 10000; //左數組最後一個數放一個大數,用作結束的標誌 right[right_length ] = 10000; //右數組的最後一個數放一個大數,用作結束的標誌 int i=0; //初始化左右兩個數組的下標 int j=0; /* 從數組的leftStart到rightEnd區間內開始迴圈比較左右兩個數組內數值的大小 如果左數組的某個值小,就把值放入對應的a數組內,左數組的數組下標加1 如果右數組的某個值小,就把值放入對應的a數組內,右數組的數組下標加1 */ for(int k=leftStart; k<rightEnd; k++) { if(left[i] < right[j]) { a[k] = left[i]; i = i + 1; }else { a[k] = right[j]; j = j + 1; } } return a; }}
排序演算法之歸併演算法