【排序算法】归并排序算法 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 ...
随机推荐
- onethink部署时后台登陆的问题
情况:本地开发后,上传到服务器时,无法登陆后台. 原因:用户的读取数据库的配置与应用的配置 分别在2个地方.而一般我们只记得修改一处配置. 解决:找到application/user/conf/con ...
- java设计模式面试
设计模式 1. 单例模式:饱汉.饿汉.以及饿汉中的延迟加载,双重检查 2. 工厂模式.装饰者模式.观察者模式. 3. 工厂方法模式的优点(低耦合.高内聚,开放封闭原则) 单例模式 分类:懒汉式单例.饿 ...
- 【蓝牙数据采集模块】-01-Sensor Controller 功能介绍
一. CC2650芯片内部的结构框图如图,内部包含: 一个Cortex-M3主控制器,用来做整个芯片的功能与任务实现 一个Cortex-M0射频控制器,用来驱动RF相关电路 一个Sensor Cont ...
- 黄聪:VPS用轻松备份工具备份Wordpress,文件夹通配符
db;log;wp-admin;wp-includes;temp;upgrade;twentyfourteen;twentyfifteen;twentysixteen;twentythirteen;t ...
- iOS 之 通知
步骤一,注册消息: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getUserProfileSu ...
- 兼容ie6及以上的表格行滑过时背景色切换的效果
;(function(window){ var tb = document.getElementById('tablelist'); function trfocus(){//为了兼容IE ...
- Angular - - $anchorScroll、$controller、$document
$anchorScroll 根据HTML5的规则,当调用这个函数时,它检查当前的url的hash值并且滚动到相应的元素. 监听$location.hash()并且滚动到url指定的锚点的地方.可以通过 ...
- swift 画图 Charts的基本使用
下面的这些代码呢是在oc工程里里使用的 其实和在swift中使用没什么大的差别 属性都一样的 //创建饼状图 self.pieChartView = [[PieChartView alloc] ...
- Java线程: 线程调度
线程调度是Java多线程的核心,只有好的调度,才能充分发挥系统的性能,提高程序的执行效率. 一.休眠 休眠的目的是使线程让出CPU的最简单做法,线程休眠的时候,会将CPU交给其他线程,以便轮换执行,休 ...
- POJ1200(hash)
Crazy Search Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27536 Accepted: 7692 Des ...