Java基础知识强化55:经典排序之归并排序(MergeSort)
1. 归并排序的原理:
原理,把原始数组分成若干子数组,对每一个子数组进行排序,
继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组
举例:
无序数组[6 2 4 1 5 9]
先看一下每个步骤下的状态,完了再看合并细节
第一步: [6 2 4 1 5 9]原始状态
第二步: [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍
第三步: [1 2 4 6] [5 9]继续两组两组合并
第四步: [1 2 4 5 6 9]合并完毕,排序完毕
输出结果:[1 2 4 5 6 9]
2. 归并排序代码实现:
package com.himi.classisort; /**
* 归并排序
* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。
* 然后再把有序子序列合并为整体有序序列
* 时间复杂度为O(nlogn)
* 稳定排序方式
* @param nums 待排序数组
* @return 输出有序数组
*/
public class MergeSoreDemo {
public static void main(String[] args) {
int[] array = new int[] { 12, 33, 4, 15, 25, 55, 18 };
System.out.println("排序前的数组:");
printArray(array);
sort(array, 0, array.length-1); System.out.println("");
System.out.println("排序后的数组:");
printArray(array); } public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左边
sort(nums, low, mid);
// 右边
sort(nums, mid + 1, high);
// 左右归并
merge(nums, low, mid, high);
}
return nums;
} public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low;// 左索引
int j = mid + 1;// 右索引
int k = 0; // 把较小的数先移到新数组中
while (i <= mid && j <= high) {
if (nums[i] < nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
} // 把左边剩余的数移入数组
while (i <= mid) {
temp[k++] = nums[i++];
} // 把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = nums[j++];
} // 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
} public static void printArray(int[] array) {
System.out.print("[");
int i;
for (i = 0; i < array.length; i++) { if (i == array.length - 1) {
System.out.print(array[i]);
} else {
System.out.print(array[i] + ",");
}
}
System.out.print("]");
}
}
程序运行结果如下:

Java基础知识强化55:经典排序之归并排序(MergeSort)的更多相关文章
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
- Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)
1. 基础知识: Android(java)学习笔记61:多线程程序的引入 ~ Android(java)学习笔记76:多线程-定时器概述和使用
- Java基础知识强化之集合框架笔记28:ArrayList集合练习之去除ArrayList集合中的重复字符串元素(升级)
1. 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 要求:不能创建新的集合,就在以前的集合上做. 2. 代码示例之 去除集合中重复元素,不创建新的集合: package ...
- Java基础知识强化54:经典排序之插入排序(InsertSort)
1. 插入排序原理图: 算法步骤: 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列. 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位 ...
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...
- Java基础知识强化56:经典排序之快速排序(QuickSort)
1. 快速排序的原理: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其 ...
- Java基础知识强化51:经典排序之桶排序(BucketSort)
1. 首先说明三点: (1)桶排序是稳定的 (2)桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 (3)桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 2. 桶排序的分析 ...
- Java基础知识强化58:经典排序之二叉树排序(BinaryTreeSort)
1. 二叉树排序 二叉树排序的描述也是一个递归的描述, 所以二叉树排序的构造自然也用递归的: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它 ...
- Java基础知识强化53:经典排序之选择排序(SelectionSort)
1.选择排序的原理图: 2. 选择排序代码实现: package cn.itcast_02; /* * 数组排序之选择排序: * 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在 ...
随机推荐
- 增加Android模拟器的内存
1,在window中,打开'C:\Users\Administrator\.android\avd\4.4.2.avd\config.ini'文件(我的是win7,xp的貌似不是'Users',是'D ...
- DSP TMS320C6000基础学习(6)—— gel文件
什么是gel文件?gel文件能干什么? gel全称General Extended Language,即通用扩展语言文件,gel文件中由类似C语言的代码构成,gel语言是一种解释性语言,gel文件扩展 ...
- 思科27亿美元收购网络安全公司Sourcefire
据国外媒体报道,思科于今日宣布将以27亿美元的总价收购网络安全公司Sourcefire,以加强自身在网络安全业务领域的优势,该交易将于今年下半年完成. [IT商业新闻网讯](记者 张良)7月23日消息 ...
- 搭建Memcached + php 缓存系统
服务器环境,Centos6.5 1.安装Memcached服务端 Yum -y install memcached 2.配置Memcached服务端用户以及自动启动服务等 将服务配置成自启动 chkc ...
- python_基本语法_01
离毕业工作还有几个月,本来想早点去公司实习,无奈gb学校不给放.好吧,既然这样,就学门语言. 参考与 http://www.cnblogs.com/vamei ,我是跟着这位博客牛人的博客教程学的,具 ...
- win8.1(64位) apache2.4.3+php5.6.3+mysql5.6安装
win8.1(64位) apache2.4.3+php5.6.3+mysql5.6安装 http://blog.csdn.net/jiangzeyun/article/details/41676639
- JAVA接口示例
总感觉有点虚,但慢慢找到感觉了.将对象放进数组里,这就比较深入了. interface drawTest{ public void draw(); public void doAnyThing(); ...
- <item.../>元素可指定如下常用属性
android:id:为菜单项指定一个唯一表实.android:title:指定菜单项的标题.android:icon:指定菜单项的图标.android:alphabeticShortcut:为菜单项 ...
- P0口上拉电阻选择
如果是驱动led,那么用1K左右的就行了.如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大:如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超 ...
- 【HDOJ】3316 Mine sweeping
简单BFS. #include <iostream> #include <cstdio> #include <cstring> #include <cstdl ...