相信刚进入到编程学习的同学,在基础部分一定会涉及到排序相关的内容,那么归并排序也是最常接触到的。时间多年,像这些算法在工作中对于我本人来说使用比较少,但是最近在复盘的阶段,所以想起这个事情了,在此做一个记录。
这篇文章我们介绍下归并排序,首先来看一张图:
从上面的动图可以看出归并排序的整个流程如下:
1)申请空间。使其大小为两个已经排序序列之和,该空间用于存放合并的列。 2)把长度为n的输入序列分成两个长度为n/2的子序列。 3)将待合并的两个数组,从第一位开始比较,小的放到暂存数组,指针向后移。 4)比较两个指针元素,选择小元素放入合并空间,并移动指针到下个位置。 5)将两个数组剩下的元素追加到暂存数组里,再将暂存数组排序后的元素放到原数组里,两个数组合成一个,这一趟结束
下面来一个java版本的归并排序演示:
package com.demo.Demo; import java.util.Arrays; public class BubblingSort { private static final int nums[] = { 1, 7, 3, 0, 2, 9, 8, 5, 4, 6 }; public static void main(String[] args) throws Exception { int[] rs_nums = sort(nums); System.out.println(Arrays.toString(rs_nums)); } private static int[] sort(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); if (arr.length < 2) { return arr; } int middle = (int) Math.floor(arr.length / 2); int[] left = Arrays.copyOfRange(arr, 0, middle); int[] right = Arrays.copyOfRange(arr, middle, arr.length); return merge(sort(left), sort(right)); } private static int[] merge(int[] left, int[] right) { int[] result = new int[left.length + right.length]; int i = 0; while (left.length > 0 && right.length > 0) { if (left[0] <= right[0]) { result[i++] = left[0]; left = Arrays.copyOfRange(left, 1, left.length); } else { result[i++] = right[0]; right = Arrays.copyOfRange(right, 1, right.length); } } while (left.length > 0) { result[i++] = left[0]; left = Arrays.copyOfRange(left, 1, left.length); } while (right.length > 0) { result[i++] = right[0]; right = Arrays.copyOfRange(right, 1, right.length); } return result; } }
运行下看下效果:
还没有评论,来说两句吧...