package practice;

import edu.princeton.cs.algs4.*;
/*
* 归并排序
* 时间复杂度O(NlgN) N为数组长度
* 归并排序在小数组上表现并不好可以用插入排序代替
*/
public class TestMain {
public static void main(String[] args) {
int[] a = new int[20];
for (int i = 0; i < a.length; i++) {
int temp = (int)(StdRandom.random()*100);
a[i] = temp;
} Merge.sort2(a); for (int i : a) {
System.out.print(i+" ");
}
}
} class Merge{
private static int []anx; //辅助数组
/*
* 自底向上的归并排序(循序渐进)
* 将数字两两分为一组,一直向上归并
* 以下数字表示数组长度,假如要排一个长度为22的数组
* 2 2 2 2 2 2 2 2 2 2 2
* 4 4 4 4 4 2
* 8 8 6
* 16 6
* 22
*/
public static void sort2(int[] a) {
anx = new int[a.length];
for (int sz = 1; sz < a.length; sz += sz) { //将要归并的大小(2*sz)翻倍
for (int lo = 0; lo < a.length - sz; lo += (sz + sz)) { //将数组分为(2*sz)大小的子数组,分别归并
merge(a, lo, lo + sz -1, Math.min(lo + 2*sz -1, a.length - 1));
}
} }
/*
* 自顶向下的归并排序(化整为零)
* 将原数组循环一分为二,直到数组长度为2,再将小数组两两循环归并为原数组
* 以下数字表示数组长度,当被分数字为单数时,前面的数组长度多一
* 22
* 11 11
* 6 5 6 5
* 3 3 2 3 3 3 2 3
* 2 1 2 1 2 1 2 1 2 1 2 1
*/
public static void sort1(int[] a) {
anx = new int[a.length];
sort1(a, 0, a.length - 1);
}
private static void sort1(int []a, int lo, int hi) {
if (lo >= hi) {
return;
}
int mid = lo + (hi - lo)/2; //当被分数字为单数时,前面的数组长度多一
sort1(a, lo, mid); //一分为二归并
sort1(a, mid + 1, hi);
merge(a, lo, mid, hi);
}
/*
* 原地归并
*/
public static void merge(int[] a, int lo, int mid, int hi) {
int m = lo;
int n = mid + 1; //当被分数字为单数时,将最中间的数字归到前面的数组(与上面对应)
int []anx = new int[hi+1];
for (int k = lo; k <= hi; k++) {
anx[k] = a[k]; //将原数组复制到辅助数组
}
//mid将数组分为A,B两部分
for (int k = lo; k <= hi; k++) {
if (m > mid) { //A中取完,将B数组剩余部分存入a[]
a[k] = anx[n++];
}
else if (n > hi) { //B中取完,将A数组剩余部分存入a[]
a[k] = anx[m++];
}
else if (anx[n] < anx[m]) { //A,B中分别取出第一个,比较,并将小数装入a[]
a[k] = anx[n++];
}
else {
a[k] = anx[m++];
}
}
}
}

归并排序动画演示

http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

归并排序Java实现的更多相关文章

  1. 归并排序 求逆序数 链表的归并排序 多线程归并排序 java

    import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...

  2. 二路归并排序java实现

    二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...

  3. 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现

    归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...

  4. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...

  5. 归并排序-java

    排序-归并排序 基本思想:是指将两个或两个以上的有序表合并成一个新的有序表. 具体步骤: (1首先将整个表看成是n个有序子表,每个子表的长度为1. (2)然后两两归并,得到n/2个长度为2的有序子表. ...

  6. leetcode23 多个拍好序的链表进行归并排序 (java版本)

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  7. 归并排序java

    import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort ...

  8. 归并排序—Java版

    一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...

  9. 归并排序——Java实现

    一.排序思想 将两个或两个以上的一排序文件合并成一个有序文件的过程叫归并,而归并排序就是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.将以有序的了序列合并,得到完全有序 ...

随机推荐

  1. 将域名转移到 Google Domains

    之前存放域名用过 Godaddy.Dynadot.Namesilo 也有阿里云(万网)和腾讯云(新网),这回就用 Google Domains 啦! 话说 Google Domains 早已是 201 ...

  2. Java工程师书单(初级、中级、高级)

    简介 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题 ...

  3. Linux修改网卡名称、主机名

    Linux修改网卡名称.主机名 环境:VirtualBox 5.0.14 + RHEL 6.5 需求:个人实验搭建一套Standby RAC时,为了节约时间,直接复制之前安装RAC的主机模板. 但复制 ...

  4. Mybatis-Generator生成Mapper文件中<if test="criteria.valid">的问题解答

    写在前面 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去 ...

  5. 拯救莫莉斯[GDOI2014]

    时间限制:1s     内存限制:256MB 问题描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标 ...

  6. css小随笔(二)与通用样式

    51先在学校HTML5已经有半个多月了,然后这个星期做了一个京东的手机网站,接触到了通用样式,下面以京东的手机站为例 这两个就是京东手机站了的不同的两个板块,因为HTML5仅仅只是学完了基本标签跟cs ...

  7. websocket 70K连接测试

    websocket 70K连接测试 最近使用socket.io做了一个实时应用,实时性.稳定性还是很让人满意的.如果拿socket.io来做小型应用,综合效率应该是最高的.但是网上少有socket.i ...

  8. 【head first python】2.共享你的代码 函数模块

    #coding:utf-8 #注释代码! #添加两个注释,一个描述模块,一个描述函数 '''这是nester.py模块,提供了一个名为print_lol()的函数, 这个函数的作用是打印列表,其中可能 ...

  9. 史上最全的java随机数生成算法[转载]

    package com.zuidaima.core.util; import java.util.Random; public class RandomUtil { public static fin ...

  10. 1.怎样控制div中的图片居中

    答案如下: #div{ width: 100%; height: 100%; border: 1px solid #000; text-align: center;}#div img{ vertica ...