Java 归并排序
1.归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并排序的主要思想说简单点就是将数组中两个挨着的数组序列进行合并排序,有人肯定会想,两个挨着的数组序列进行排序,那不
直接将数组分成两组就可以排序了三,想法是对的,但现实是骨感的。如果直接用两个数组进行排序,那样归并排序就没有意义了。
实际上归并是是将一个长度为n的数组,分割成n个序列,将n个序列两两挨着排序,变成N/2个长度为2或者1的序列,在进行两两合并排序。形成长度为n的序列后,就排序完成了。
其实就有点想以前学语文一样老师叫分析文章的布局:总 - 分 - 总 的思想。
2.关键代码介绍:
1 两个****有序****数组序列排序方法: 2 /** 3 * 将两个有序数组进行排序 4 * @param a 顺序数组1 5 * @param b 顺序数组2 6 * @param temp 临时存储变量 7 */ 8 public void merageArray(int[] a, int[] b, int[] temp) { 9 int i, j, k, m, n; 10 n = a.length; 11 m = b.length; 12 i = j = k = 0; 13 while (i < n && j < m) { 14 if (a[i] < b[j]) { 15 temp[k++] = a[i++]; 16 } else { 17 temp[k++] = a[j++]; 18 } 19 } 20 while (i < n) { 21 temp[k++] = a[i++]; 22 } 23 while (j < m) { 24 temp[k++] = a[j++]; 25 } 26 }
3.完整的一个例子对一个数组进行归并排序
两个****有序****数组序列排序方法:
1 /** 2 * 将两个有序数组进行排序 3 * @param a 顺序数组1 4 * @param b 顺序数组2 5 * @param temp 临时存储变量 6 */ 7 public void merageArray(int[] a, int[] b, int[] temp) { 8 int i, j, k, m, n; 9 n = a.length; 10 m = b.length; 11 i = j = k = 0; 12 while (i < n && j < m) { 13 if (a[i] < b[j]) { 14 temp[k++] = a[i++]; 15 } else { 16 temp[k++] = a[j++]; 17 } 18 } 19 while (i < n) { 20 temp[k++] = a[i++]; 21 } 22 while (j < m) { 23 temp[k++] = a[j++]; 24 } 25 } 26 3.完整的一个例子对一个数组进行归并排序 27 public class MergrSort { 28 /** 29 * 将有序数组排序 30 * 31 * @param a 32 * 要排序的数组 33 * @param first 34 * 排序的起始位置 35 * @param last 36 * 排长的终点位置 37 * @param temp 38 * 排序临时存储容器 39 */ 40 public void mergeArray(int[] a, int first, int last, int[] temp) { 41 int n, m, i, j, k, mid; 42 k = 0; 43 mid = (first + last) / 2; 44 i = first; 45 n = mid; 46 j = mid + 1; 47 m = last; 48 while (i <= n && j <= m) { 49 if (a[i] < a[j]) { 50 temp[k++] = a[i++]; 51 } 52 else { 53 temp[k++] = a[j++]; 54 } 55 } 56 while (i <= n) { 57 temp[k++] = a[i++]; 58 } 59 while (j <= m) { 60 temp[k++] = a[j++]; 61 } 62 // 将数组中的数据进替换 63 for (int num = first; num <= last; num++) { 64 a[num] = temp[num - first]; 65 } 66 } 67 /** 68 * 采采用递归进行拆分排序 69 * 70 * @param a 71 * @param first 72 * @param last 73 * @param temp 74 */ 75 public void merageSort(int[] a, int first, int last, int[] temp) { 76 int i, j, k, n, m, mid; 77 mid = (first + last) / 2; 78 i = first; 79 n = mid; 80 j = mid + 1; 81 m = last; 82 if (first < last) { 83 merageSort(a, first, n, temp); 84 merageSort(a, j, m, temp); 85 mergeArray(a, first, last, temp); 86 } 87 } 88 }
*********************主函数****************************
1 public static void main(String[] args) { 2 int[] a = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 }; 3 int[] temp = new int[a.length]; 4 MergrSort sort = new MergrSort(); 5 sort.merageSort(a, 0, a.length - 1, temp); 6 7 for (int i = 0; i < a.length; i++) { 8 System.out.println("数组里面的内容是-->>" + a[i]); 9 } 10 11 }
*********************运行后的效果****************************