归并排序

来源:互联网 发布:sqlite数据库查看器 编辑:程序博客网 时间:2024/06/05 14:42

归并排序

public class MergeSort {public static int[] Sort(int[] a) {/* 此处使用和原数组大小一样的数组 */int[] b = new int[a.length];/*额外的数组空间*/mergeSort(a, b, 0, a.length - 1);return a;}private static void mergeSort(int[] a, int[] b, int low, int high) {if (low < high) {int mid = (low + high) / 2;/*不断进行递归分解,直到合并的长度为1时找到递归出口,开始沿递归路径向上走*/mergeSort(a, b, low, mid);mergeSort(a, b, mid + 1, high);merge(a, b, low, mid, high);}}private static void merge(int[] a, int[] b, final int left, final int center,final int right) {int bPos = left;/*临时数组的索引*//*使用以下临时变量主要用于便于理解,不易产生混淆*/int leftStart = left;/*左起始点*/int leftEnd = center;/*左结束点*/int rightStart = center + 1;/*右起始点*/int rightEnd = right;/*右结束点*//*在两个左右分解数组中选出最小的一个放入临时数组中*/while (leftStart <= leftEnd && rightStart <= rightEnd) {if (a[leftStart] <= a[rightStart])b[bPos++] = a[leftStart++];else {b[bPos++] = a[rightStart++];}}/*如果有剩余直接复制到临时数组里*/while (leftStart <= leftEnd) {b[bPos++] = a[leftStart++];}while (rightStart <= rightEnd) {b[bPos++] = a[rightStart++];}/*将临时数组中排好序的部分复制到原数组中*/for (int i = left; i <= right; i++) {a[i] = b[i];}}}


原创粉丝点击