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