【排序算法】归并排序算法 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 ...
随机推荐
- HTML CSS基础(二)
块元素和行内元素 HTML元素根据表现形式,可以分为2类: (1)块元素(block): (2)行内元素(inline): 任何HTML元素都属于这两类中的其中一类. 2.块元素特点: (1)独占一行 ...
- SQL Select结果增加自增自段(网转)
http://www.cnblogs.com/haver/archive/2011/07/14/2106349.html/* 方法一*/ SELECT 序号= (SELECT COUNT(客户编号) ...
- iOS UITabBar
参考文章:http://www.cnblogs.com/wendingding/p/3775488.html 简单明了,不用再总结了.
- iOS 开发 之 编程知识点
iOS 创建和设置pch iOS 之 时间格式与字符串转换 iOS 之 二维码生成与扫描(LBXScan) iOS 之 定时器 iOS 之 通知 iOS 之 NSString 去除前后空格和回车键 i ...
- 常用的JavaScript字符串处理函数及用法
最近参加了几次前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等,如果你经常参加笔试或者也是一个过来人,相信你也跟我一样,发现字符串的处理是前端招聘过程中最 ...
- BNU Online Judge-34776-What does the fox say?
题目链接 http://www.bnuoj.com/bnuoj/problem_show.php?pid=34776 题意: fox 的叫声 例如测试用例 输入 toot woof wa ow ow ...
- jQuery事件触发和参数传递
jQuery事件触发和参数传递: 参考:http://www.jb51.net/article/36249.htm <%@ page language="java" impo ...
- 马丁 福勒 Martin Fowler 关于依赖注入和反转控制的区别
马丁 福勒 Martin Fowler 关于依赖注入和反转控制的区别 http://martinfowler.com/articles/injection.html 中文翻译:http://files ...
- Recurrent Neural Network系列2--利用Python,Theano实现RNN
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- ES2:ElasticSearch 集群配置
ElasticSearch共有两个配置文件,都位于config目录下,分别是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 用来配置Elastic ...