排序系列之归并排序
来源:互联网 发布: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); } } }
- 排序系列之归并排序
- 排序系列之-归并排序
- 数据结构系列之归并排序
- 算法系列之归并排序
- 七大排序算法系列之归并排序
- 排序算法系列之归并排序
- 排序系列之快速排序和归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 排序之归并排序
- 安装Microsoft Windows SDK 7.1时出现的错误(附解决办法)
- [转]Eclipse快捷键
- Python调用C语言函数
- 穿梭于北京的地铁站
- mini2440 rtc时钟设备驱动开发源代码(宋宝华框架)
- 排序系列之归并排序
- linux设备驱动开发之《报警器项目》源代码
- 笔面试经历(一)
- hdu1728 逃离迷宫
- 学习不光是理性的也同样是感性的
- 设计模式之二:简单工厂模式
- eclipse下如何配置android模拟器环境
- java 访问者模式
- 【网络层】精析网络层 -- 因特网的路由选择协议