归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
链接:http://blog.csdn.net/morewindows/article/details/6678165
public class Sort { static final int MAX = 20; public static void main(String[] args) { int[] data = new int[MAX]; Random random = new Random(); // 生成一个随机数组 for (int i = 0; i < MAX; i++) { data[i] = random.nextInt(MAX * MAX); } // 打印排序前数据内容 System.out.println(Arrays.toString(data)); // 归并排序 mergsort(data, 0, MAX-1); // 打印排序后的数组 System.out.println(Arrays.toString(data)); } static void mergsort(int[] data, int first, int last) { if (first < last) { int mid = (first + last) / 2; mergsort(data, first, mid); // 归并数组的前一半 mergsort(data, mid + 1, last); // 归并数组后一般 mergearray(data, first, mid, last); // 归并数组 } } static void mergearray(int[] data, int first, int mid, int last) { int i = first; int j = mid + 1; int m = mid; int n = last; int k = 0; int[] temp = new int[data.length]; while (i <= m && j <= n) { // 依次比较,选取最小的放入临时数组汇总 if (data[i] <= data[j]) { temp[k++] = data[i++]; } else { temp[k++] = data[j++]; } } // 如果还有没有比较的,则放在数组后面插入 while (i <= m) { temp[k++] = data[i++]; } // 如果还有没有比较的,则放在数组后面插入 while (j <= n) { temp[k++] = data[j++]; } // 复制到原始的数组中 for (i = 0; i < k; i++) { data[first + i] = temp[i]; } } }