归并排序算法 java 实现
归并排序算法 java 实现
算法概念
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
算法思想
从概念上讲,归并排序的工作原理如下:
- 如果列表的长度是0或1,那么它已经有序。否则:
- 未排序的部分平均划分为两个子序列。
- 每个子序列,递归使用归并排序。
- 合并两个子列表,使之整体有序。
归并排序包含两个主要观点,以改善其运行时:
- 一个小列表排序的花费少于大列表。
- 把两个有序表合并,要比直接排列一个无序表花费更少的步骤。例如,您只需要遍历每个有序列表一次即可(见下面的合并功能)。
归并操作的过程如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
算法实现
package com.lygedi.sort;
public class MergeSort {
public void sort(int[] list, int iStart, int iStop) {
if (iStop > iStart) {
int iMiddle = (iStart + iStart) / 2;
sort(list, iStart, iMiddle);
sort(list, iMiddle + 1, iStop);
merge(list, iStart, iMiddle, iStop);
}
}
public void merge(int[] a, int iStart, int iMiddle, int iStop) {
int lt = iStop - iStart + 1;
int[] list = new int[lt];
int pa = iStart;
int pb = iMiddle + 1;
for(int i = 0; i < lt; i++) {
//利用两个指针对两个数组做对比,将小的放到临时数组
if (a[pa] < a[pb]) {
list[i] = a[pa];
pa++;
} else if (a[pa] == a[pb]) {
list[i] = a[pa];
i++;
list[i] = a[pb];
pa++;
pb++;
} else {
list[i] = a[pb];
pb++;
}
//一个指针到底后,将另一数组全部放到临时数组
if (pa > iMiddle) {
for (int j = i + 1; j < lt; j++) {
list[j] = a[pb];
pb++;
}
break;
}
if (pb > iStop ) {
for (int j = i + 1; j < lt; j++) {
list[j] = a[pa];
pa++;
}
break;
}
}
//将临时数组复制回原数组
int j = iStart;
for(int i = 0; i<lt; i++){
a[j] = list[i];
j++;
}
}
public static void main(String[] args) {
int a[] = { 49, 38, 65, 9, 76, 13, 27, 49, 8, 34, 12, 64, 49, 56, 2, 51, 13, 5, 4, 62, 99, 98, 54, 56, 17, 17,
18, 23, 34, 56, 15, 35, 25, 53, 51 };
MergeSort qs = new MergeSort();
qs.sort(a, 0, a.length - 1);
System.out.println(a.length);
for (int i = 0; i < a.length; i++)
System.out.println(Integer.toString(i) + "-" + a[i]);
}
}
归并排序算法 java 实现的更多相关文章
- 归并排序算法-Java实现
简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...
- 归并排序算法Java实现
一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...
- 排序系列 之 归并排序算法 —— Java实现
基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...
- 【排序算法】归并排序算法 Java实现
归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 基本思想 可以将一组数组分成A,B两组 依次类推,当分出来的小组只有一 ...
- MergeSort(归并排序)算法Java实现
归并排序 归并排序 (merge sort) 是一类与插入排序.交换排序.选择排序不同的另一种排序方法.归并的含义是将两个或两个以上的有序表合并成一个新的有序表.归并排序有多路归并排序.两路归并排序 ...
- 算法-java代码实现归并排序
归并排序 对于一个int数组,请编写一个归并排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
- 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- 【java排序】 归并排序算法、堆排序算法
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- java实现归并排序算法
归并排序算法思想:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.第二, 治理: ...
随机推荐
- 用PS去除图片中文字的6个方法
转自:http://www.u148.net/article/486.html 1.使用仿制图章工具去除文字. 这是比较常用的方法.具体的操作是,选取仿制图章工具,按住Alt键,在无文字区域点击相似的 ...
- Mac 系统环境变量配置
Mac 系统环境变量配置 例如这里要配置一下 QUICK_V3_ROOT 的环境变量 1.打开终端 输入 vim ~/.bash_profile 2.一直回车 知道出现以下选项 按 E 编辑 ...
- VerifyCodeUtil.java
package com.vcredit.framework.utils; import java.awt.Color;import java.awt.Font;import java.awt.Grap ...
- 浏览器IE与非IE区分
1. window.VBArray IE自带 if(window.VBArray) {console.log("IE 浏览器");} else{console.log(" ...
- redisTemplate的spring配置以及lua脚本驱动
最近在使用spring-data-redis的redisTemplate,所以写篇使用记录吧. 1.不用多说,使用maven引入相关依赖,因为项目已经引入其他的 <dependency> ...
- 在win10里打开.hlp文件
D7的帮助都是.hlp格式的, 目前win10还没有相应的补丁, 导致无法打开 自己手动来处理一下: 1. 下载连接中的winhlp32.rar, 这个是从XP系统里提取的 2. 修改windows ...
- python thrift 服务端与客户端使用
一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...
- ubuntu与登录有关的log配置信息
1. 所有sudo, sshd, sftp登录的信息都在auth.log中. 2. pam的配置是在/etc/pam.conf与/etc/pam.d中,在文件夹pam.d对cron, sudo,ssh ...
- Python学习【第八篇】Set集合
Set集合 set集合是无序,不能重复,可嵌套的序列 如何创建 li = [] dic = {"k1":123} se = {"123","456&q ...
- log4j+mongodb
maven 配置: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...