【排序算法】归并排序算法 Java实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
基本思想
- 可以将一组数组分成A,B两组
- 依次类推,当分出来的小组只有一个数据时,就可以认为这个小组已经达到了有序
- 然后合并相邻的两个小组
- 这样先通过递归的分解数组,再合并数组就可以完成 归并排序。
两个数组的合并算法实现
public class Merge {
public static void main(String[] args) {
int[] arrayA = new int[] { 1, 6, 3, 4, 5 };
int[] arrayB = new int[] { 2, 7, 8, 9 };
int[] temp = new int[9];
mergeArray(arrayA, arrayA.length, arrayB, arrayB.length, temp);
for (int i : temp) {
System.out.print(i + " ");
}
}
/**
* 将数组 arrayA[] 和 arrayB[] 合并到 arrayC[]
*/
private static void mergeArray(int arrayA[], int lengthA, int arrayB[], int lengthB, int temp[]) {
int i = 0, j = 0, k = 0;
while (i < lengthA && j < lengthB) { // 将两个有序的数组合并,排序到辅助数组temp中
if (arrayA[i] > arrayB[j]) {
temp[k++] = arrayB[j++];
}
else {
temp[k++] = arrayA[i++];
}
}
while (i < lengthA) { // 如果arrayA[] 中还没有合并完的,则直接将arrayA[]中没有合并的数组复制到辅助数组中
temp[k++] = arrayA[i++];
}
while (j < lengthB) { // 如果arrayB[] 中还没有合并完的,则直接将arrayB[]中没有合并的数组复制到辅助数组中
temp[k++] = arrayB[j++];
}
}
}
- 算法实现
public class MergeSorter {
public void sort(int[] array) {
int[] auxArray = new int[array.length];
mergeSort(array, auxArray, 0, array.length - 1);
}
/**
* 基于分治思想,执行归并排序
*/
private void mergeSort(int[] array, int[] auxArray, int low, int high) {
int dividedIndex = 0;
if (low < high) {
dividedIndex = (low + high) / 2;
mergeSort(array, auxArray, low, dividedIndex); // 左边递归归并排序
mergeSort(array, auxArray, dividedIndex + 1, high); // 右边递归归并排序
mergeArray(array, auxArray, low, dividedIndex, high); // 合并分治结果
}
}
private void mergeArray(int[] array, int[] temp, int low, int dividedIndex, int high) {
int i = low; // 指向左半分区的指针
int j = dividedIndex + 1; // 指向右半分区的指针
int k = 0; // 指向辅助数组的指针
while (i <= dividedIndex && j <= high) {
if (array[i] > array[j]) {
temp[k++] = array[j++];
} else {
temp[k++] = array[i++];
}
}
while (i <= dividedIndex) {
temp[k++] = array[i++];
}
while (j <= high) {
temp[k++] = array[j++];
}
// 最后把辅助数组的元素复制到原来的数组中去,归并排序结束
for (i = low, k = 0; i <= high; i++, k++) {
array[i] = temp[k];
}
}
}
参考文章:
1.http://shiyanjun.cn/archives/820.html
2.http://blog.csdn.net/morewindows/article/details/6678165
【排序算法】归并排序算法 Java实现的更多相关文章
- 【java排序】 归并排序算法、堆排序算法
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- python实现折半查找算法&&归并排序算法
今天依旧是学算法,前几天在搞bbs项目,界面也很丑,评论功能好像也有BUG.现在不搞了,得学下算法和数据结构,笔试过不了,连面试的机会都没有…… 今天学了折半查找算法,折半查找是蛮简单的,但是归并排序 ...
- 希尔排序和归并排序(java实现)
希尔排序 希尔排序算法实际上是一种特殊的插入排序,由DL.Shell于1959年提出而得名. 算法思想:希尔排序使数组中任意间隔为h的元素都是有序的,这些数组称为h有序数组,对于每个h,按插入排序进行 ...
- 排序算法-归并排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 201 ...
- java泛型中使用的排序算法——归并排序及分析
一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...
- 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- 排序算法总结及Java实现
1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...
- 排序算法总结(基于Java实现)
前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
随机推荐
- wdcp使用记录--持续更新
1.扩展memcache 资源地址:http://download.csdn.net/detail/fangminglei/8390449 上传至root文件夹运行 注:官方提供的文件不能安装,需要改 ...
- 2781: [JSOI2007]文本生成器
2781: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 8 Solved: 4[Submit][Status][We ...
- Python dir()函数
您可以使用内置的dir()函数列出一个定义对象的标识符.例如,对于一个模块,包括在模块中定义的函数,类和变量. 当你给dir()提供一个模块名字时,它返回在那个模块中定义的名字的列表.当没有为其提供参 ...
- 在JS中使用COM组件的方法
首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 ...
- J.U.C并发框架
转载:http://itindex.net/detail/48869-j.u.c-%E6%A1%86%E6%9E%B6 J.U.C并发框架 作者:Doug Lea SUNY Oswego Oswego ...
- Windows 10 IoT Serials 4 - 如何在树莓派上使用Cortana语音助手
从Windows 10 IoT Core 14986版本开始,微软已经加入Cortana语音助手功能.之前,我们只能使用本地语音识别,需要编写应用程序,下载到设备中才能实现.从现在开始,微软已经从系统 ...
- echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮
echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮 >>>>>>>>>>>>>>&g ...
- mysql学习之权限管理
数据库权限的意义: 为了保证数据库中的业务数据不被非授权的用户非法窃取,需要对数据库的访问者进行各种限制,而数据库安全性控制措施主要有这三种,第一种用户身份鉴别,手段可以是口令,磁卡,指纹等技术,只有 ...
- SQL2012还原数据库操作在本地服务器上操作和用别的电脑远程连接到服务器进行操作的文件路径差异
在数据库服务器上想还原一个数据库到某个备份文件时期的,服务器的数据库文件本身是保存在 D:\DEVDB目录 通过开发电脑上的MS manager来连接数据库服务器操作还原 虽发现文件卡项上,原始文件名 ...
- Linux驱动技术(一) _内存申请
先上基础,下图是Linux的内存映射模型,其中体现了Linux内存映射的几个特点: 每一个进程都有自己的进程空间,进程空间的0-3G是用户空间,3G-4G是内核空间 每个进程的用户空间不在同一个物理内 ...