排序算法(七):归并排序

来源:互联网 发布:linux top命令详解 编辑:程序博客网 时间:2024/06/06 19:52

思路:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。



代码实现:

public class MergingSort {public static void main(String[] args) {int a[] = { 49, 38, 65, 56, 17, 18, 23, 34, 15 };sort(a, 0, a.length - 1);for (int i = 0; i < a.length; i++)System.out.println(a[i]);}public static void sort(int[] data, int left, int right) {if (left < right) {// 找出中间索引int center = (left + right) / 2;// 对左边数组进行递归sort(data, left, center);// 对右边数组进行递归sort(data, center + 1, right);// 合并merge(data, left, center, right);}}public static void merge(int[] data, int left, int center, int right) {int[] tmpArr = new int[data.length];int mid = center + 1;// third记录中间数组的索引int third = left;int tmp = left;while (left <= center && mid <= right) {// 从两个数组中取出最小的放入中间数组if (data[left] <= data[mid]) {tmpArr[third++] = data[left++];} else {tmpArr[third++] = data[mid++];}}// 剩余部分依次放入中间数组while (mid <= right) {tmpArr[third++] = data[mid++];}while (left <= center) {tmpArr[third++] = data[left++];}// 将中间数组中的内容复制回原数组while (tmp <= right) {data[tmp] = tmpArr[tmp++];}System.out.println(Arrays.toString(data));}}

得到:

[38, 49, 65, 56, 17, 18, 23, 34, 15]
[38, 49, 65, 56, 17, 18, 23, 34, 15]
[38, 49, 65, 17, 56, 18, 23, 34, 15]
[17, 38, 49, 56, 65, 18, 23, 34, 15]
[17, 38, 49, 56, 65, 18, 23, 34, 15]
[17, 38, 49, 56, 65, 18, 23, 15, 34]
[17, 38, 49, 56, 65, 15, 18, 23, 34]
[15, 17, 18, 23, 34, 38, 49, 56, 65]
15
17
18
23
34
38
49
56
65





原创粉丝点击