This is a Natural Merge Sort program from my textbook. It works, but I don't think it's good.

// Natural merge sort program in the textbook

public class NaturalMergeSortProgram {

    public static void main(String[] args)
{
int a[] = new int[10000000];
int b[] = new int[a.length];
for (int i = 0; i < a.length; i++)
a[i] = (int)(1+Math.random()*(1000-1+1));
long starTime=System.currentTimeMillis();
NaturalMergeSort(a, b);
long endTime=System.currentTimeMillis();
long Time = endTime - starTime;
System.out.println("executing time: "+Time+"(ms)");
/*for (int i = 0; i < b.length; i++)
{ if (i % 20 == 0)
System.out.println();
System.out.print(a[i]+" ");
}*/
} public static void NaturalMergeSort(int a[], int b[])
{ // merge array a into b and then b into a until sorted
while (!MergeRuns(a, b) & !MergeRuns(b, a));
} public static boolean MergeRuns(int a[], int b[])
{
int i = 0, k = 0;
int n = a.length;
boolean asc = true;
int x;
while (i < n)
{
k = i;
do
x = a[i++];
while (i < n && x <= a[i]); // elements are increasing while (i < n && x >= a[i]) // elements are decreasing
x = a[i++];
merge(a, b, k , i-1, asc);
asc = !asc;
}
return k == 0;
} public static void merge(int a[], int b[], int low, int high, boolean asc)
{ // merge a[low:high] into b[low:high]
int k = asc ? low : high;
int c = asc ? 1 : -1;
int i = low, j = high;
while (i <= j)
{
if (a[i] <= a[j])
b[k] = a[i++];
else
b[k] = a[j--];
k += c;
}
} }

Or maybe I don't get it? Because it's rather obscure and lack of comments( these comments are all added by me).

So I decide to write my own Natural Merge Sort program:

// My own natural merge sort program
public class MyNaturalMergeSort { public static void main(String args[]) {
int a[] = new int[10000000];
int b[] = new int[a.length];
for (int i = 0; i < a.length; i++)
a[i] = (int)(1+Math.random()*(1000-1+1)); long starTime=System.currentTimeMillis();
while (!NaturalMergeSort(a, b) && !NaturalMergeSort(b, a));
long endTime=System.currentTimeMillis();
long Time = endTime - starTime;
System.out.println("executing time: "+Time+"(ms)");
for (int i = 0; i < 100; i++)
{ if (i % 20 == 0)
System.out.println();
System.out.print(a[9999*i]+" ");
}
System.out.println(a[a.length-1]);
} public static boolean NaturalMergeSort(int x[], int y[]) {
// find the two adjacent natural increasing arrays x[l:m] and x[m+1:r],
// then merge them into y[l:r] using function merge()
int i, l = 0, m = 0, r;
for (i = 0; i < x.length; i++)
{ l = i;
while ((i < x.length-1) && (x[i] <= x[i+1])) // get x[l:m]
i++;
m = i++;
while ((i < x.length-1) && (x[i] <= x[i+1])) // get x[m+1:r]
i++;
r = (i == x.length) ? i-1 : i; // if it's true, that means array x is
// already sorted, we only need to copy
// array x to array y
merge(x, y, l, m, r);
}
return (l == 0) && (m == x.length - 1); // it's true only when the whole
// array is already sorted
} public static void merge(int x[], int y[], int l, int m, int r) {
// merge x[l:m] and x[m+1:r] into y[l:r]
int i = l,
j = m+1,
k = l;
while ((i <= m) && (j <= r))
if (x[i] <= x[j])
y[k++] = x[i++];
else
y[k++] = x[j++];
while (k <= r)
if (i > m) // elements in x[l:m] are all merged into array y[]
y[k++] = x[j++];
else
y[k++] = x[i++]; }
}

After running each program for 3 times, I got the executing time as below:

program in textbook -- 1457ms 1389ms 1359ms

my program -- 1281ms 1172ms 1185ms

In average, my program saves roughly 0.2 second. Though it's not that better, it still makes me exciting!

And through this practice, I came to know there's a lot of fun hacking the algorithm. I'm looking forword to write more beautiful and efficient code!

Natural Merge Sort(自然归并排序)的更多相关文章

  1. 【算法】归并排序(Merge Sort)(五)

    归并排序(Merge Sort) 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...

  2. 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)

    连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...

  3. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  4. 归并排序(Merge Sort)

    归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序 ...

  5. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  6. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

  7. 归并排序 ALDS1_5_B:Merge Sort

    Merge Sort Write a program of a Merge Sort algorithm implemented by the following pseudocode. You sh ...

  8. 【高级排序算法】2、归并排序法的实现-Merge Sort

    简单记录 - bobo老师的玩转算法系列–玩转算法 -高级排序算法 Merge Sort 归并排序 Java实现归并排序 SortTestHelper 排序测试辅助类 package algo; im ...

  9. 【高级排序算法】1、归并排序法 - Merge Sort

    归并排序法 - Merge Sort 文章目录 归并排序法 - Merge Sort nlogn 比 n^2 快多少? 归并排序设计思想 时间.空间复杂度 归并排序图解 归并排序描述 归并排序小结 参 ...

随机推荐

  1. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  2. linux 生成随机密码和wordlist常用方法

    注:文章内容来自网络收集 关于下面这10个方法,估计很多人也知道了,这里也是为了自己以后用收集一下,不过顺便吐槽下,google第一页,只要是“linux 随机密码”这几个类似的关键字,蹦出来的全特么 ...

  3. 项目总结一:响应式之CSS3 媒体查询

    1.<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scala ...

  4. js中的undefined 和null

    undefined是基本数据类型 表示未定义 缺少的意思 null是引用数据类型  是对象 表示空对象 undefined是从null派生出来的  所以undefined==null  true Ja ...

  5. 微信退款流程,以及在过程中遇见的错误和解决方式(php 语言)

    官方下载demo 1:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 开发步骤  :    https://pay.weix ...

  6. css中居中方法小结

    ---恢复内容开始--- 1.文字垂直居中 .header_nav-item{ height:38px; line-height:38px; } 即文字所在模块的高度和行高设置成一样的! 2.块元素垂 ...

  7. Java 基础 -- 泛型、集合、IO、反射

    package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...

  8. 写了一个bug,最后却变成了feature,要不要修呢?

    事情是这样子的,前不久接到一个需求,为一个游戏开发礼包码功能 通常一款游戏运营期间会搞各种各样的活动吸引玩家,其中最常见的就是发放礼包,  玩家可以通过礼包码兑换礼包. 用礼包码兑换礼包有个一限制,游 ...

  9. js判断值为null

    今天在做项目的时候,犯了一个着实不应该的错误,拿到data为null,然后判断如果为null执行A,否则执行B 我错误的代码是 if(data===null){ A; }else{ B; } 怎么调试 ...

  10. rpm命令常用选项

    安装rpm包 # rpm -ivh ***.rpm #其中i表示安装,v表示显示安装过程,h表示显示进度 升级rpm包 # rpm -Uvh ***.rpm 删除软件包 # rpm -e PACKAG ...