1. 归并排序的原理:
原理,把原始数组分成若干子数组,对每一个子数组进行排序,
继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组
举例:
无序数组[6 2 4 1 5 9]
先看一下每个步骤下的状态,完了再看合并细节
第一步: [6 2 4 1 5 9]原始状态
第二步: [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍
第三步: [1 2 4 6] [5 9]继续两组两组合并
第四步: [1 2 4 5 6 9]合并完毕,排序完毕
输出结果:[1 2 4 5 6 9]
2. 归并排序代码实现:
1 package cn.itcast; 2 3 /* 4 * 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 5 * 如设有数列{6,202,100,301,38,8,1} 6 * 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数 7 * i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3 8 * i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4 9 * i=3 [ 1 6 8 38 100 202 301 ] 4 10 */ 11 public class MergeSort { 12 public static void sort(int[] data) { 13 int[] temp = new int[data.length]; 14 mergeSort(data, temp, 0, data.length - 1); 15 } 16 17 private static void mergeSort(int[] data, int[] temp, int l, int r) { 18 int mid = (l + r) / 2; 19 if (l == r) 20 return; 21 mergeSort(data, temp, l, mid); 22 mergeSort(data, temp, mid + 1, r); 23 24 for (int i = l; i <= r; i++) { 25 temp[i] = data[i]; 26 } 27 int i1 = l; 28 int i2 = mid + 1; 29 for (int cur = l; cur <= r; cur++) { 30 if (i1 == mid + 1) 31 data[cur] = temp[i2++]; 32 else if (i2 > r) 33 data[cur] = temp[i1++]; 34 else if (temp[i1] < temp[i2]) 35 data[cur] = temp[i1++]; 36 else 37 38 data[cur] = temp[i2++]; 39 } 40 } 41 }
时间: 2024-10-23 22:29:49