排序系列之归并排序

来源:互联网 发布:ubuntu 压缩软件 编辑:程序博客网 时间:2024/04/28 02:53

 近日,因分跟老婆一个归并排序的实现,由于对其很熟悉,从没有自己实现过,就让老婆实现去了,谁知道,她写完自己都不是很清楚原理,故我自己实现之,发现归并排序居然每次要将排好的序列拷贝到另一个数组中,这样浪费的操作,故研究之,发现一个不要拷贝数据的优化处理和大家分享。

public static void insertSort(int a[], int low, int high) {for (int i = low; ++i < high;) {int j = i, key = a[i];if (a[--j] > key) {do {a[j + 1] = a[j];} while (--j >= low && a[j] > key);a[j + 1] = key;}}}static boolean Merge(int out[], int in[], int low, int mid, int high) {if (in[mid - 1] <= in[mid]) {return false;}int i = low;int j = mid;do {if (in[i] <= in[j])out[low++] = in[i++];elseout[low++] = in[j++];} while (i < mid && j < high);if (i < mid) {do {out[low++] = in[i++];} while (i < mid);} else {do {out[low++] = in[j++];} while (j < high);}return true;}// 有序序列在out中static void MergeSwap(int out[], int in[], int low, int mid, int high) {int i = low;int j = mid;do {if (out[i] <= in[j])in[low++] = out[i++];elsein[low++] = in[j++];} while (i < mid && j < high);while (i < mid) {in[low++] = out[i++];}}/** * 返回0 有序序列在in中 返回1 有序序列在out中 *  */static boolean MergeSort(int out[], int in[], int low, int high) {if (high - low < 7) {insertSort(in, low, high);return false;}int mid = (low + high) >>> 1;boolean lowStatus = MergeSort(out, in, low, mid);boolean highStatus = MergeSort(out, in, mid, high);if (highStatus) {// 高位序列在out中则交换in,out序列int[] point = in;in = out;out = point;}if (highStatus ^ lowStatus) { // 高低位不同MergeSwap(out, in, low, mid, high);// 有序序列和高位序列在一个序列中return highStatus;} else {// 高低位相同return Merge(out, in, low, mid, high) ^ lowStatus;//}}public static void MergeSort(int[] a) {int length = a.length;int[] b = new int[length];if (MergeSort(b, a, 0, length)) {System.arraycopy(b, 0, a, 0, length);}}

没有经过处理的代码是:

 static boolean MergeSort(int out[], int in[], int low, int high) {          if (high - low <= 1) {  //            insertSort(in, low, high);              return false;          }          int mid = (low + high) >>> 1;          boolean lowStatus = MergeSort(out, in, low, mid);          boolean highStatus = MergeSort(out, in, mid, high);          if(highStatus){//高位out有序        if(lowStatus){//低位out有序        return !Merge(in,out,low,mid,high);        }else{//低位in有序        MergeSwap(in, out, low, mid, high);        return true;        }        }else{//高位in有序        if(lowStatus){//低位out有序        MergeSwap(out, in, low, mid, high);        return false;        }else{        return Merge(out,in,low,mid,high);        }        }            }  



 

原创粉丝点击