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. angular添加,查找与全部删除

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  3. maven overlays 合并多个war

    http://kyfxbl.iteye.com/blog/1678121 http://jdonee.iteye.com/blog/794226

  4. CountDownLatch、CyclicBarrier和 Semaphore比较

    1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行: ...

  5. (转)UML类图与类的关系详解

    转载自:http://www.uml.org.cn/oobject/201104212.asp 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Rea ...

  6. (转)Java开发中的23种设计模式详解

    原文出自:http://blog.csdn.net/zhangerqing 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型 ...

  7. 基于itchat的微信群聊小助手基础开发(一)

    前段时间由于要管理微信群,基于itchat开发了一个简单的微信机器人 主要功能有: 图灵机器人功能 群聊昵称格式修改提示 消息防撤回功能 斗图功能 要开发一个基于itchat的最基本的聊天机器人,在g ...

  8. LeetCode 88. Merge Sorted Array(合并有序数组)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

  9. 最新版multer1.3.0上传文件

    完整项目资源下载路径:http://download.csdn.net/detail/qq_28506819/9851744 使用方法: cd到跟目录,然后npm install. 运行项目,npm ...

  10. 数据分析基础之Linalg的使用

    Linear algebra 简介 When SciPy is built using the optimized ATLAS LAPACK and BLAS libraries, it has ve ...