归并排序算法 java 实现

可视化对比十多种排序算法(C#版)

[直观学习排序算法] 视觉直观感受若干常用排序算法

算法概念

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

算法思想

从概念上讲,归并排序的工作原理如下:

  • 如果列表的长度是0或1,那么它已经有序。否则:
  • 未排序的部分平均划分为两个子序列。
  • 每个子序列,递归使用归并排序。
  • 合并两个子列表,使之整体有序。

归并排序包含两个主要观点,以改善其运行时:

  • 一个小列表排序的花费少于大列表。
  • 把两个有序表合并,要比直接排列一个无序表花费更少的步骤。例如,您只需要遍历每个有序列表一次即可(见下面的合并功能)。

归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针到达序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

算法实现

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 实现的更多相关文章

  1. 归并排序算法-Java实现

    简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...

  2. 归并排序算法Java实现

    一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...

  3. 排序系列 之 归并排序算法 —— Java实现

    基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...

  4. 【排序算法】归并排序算法 Java实现

    归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 基本思想 可以将一组数组分成A,B两组 依次类推,当分出来的小组只有一 ...

  5. MergeSort(归并排序)算法Java实现

    归并排序  归并排序 (merge sort) 是一类与插入排序.交换排序.选择排序不同的另一种排序方法.归并的含义是将两个或两个以上的有序表合并成一个新的有序表.归并排序有多路归并排序.两路归并排序 ...

  6. 算法-java代码实现归并排序

    归并排序 对于一个int数组,请编写一个归并排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...

  7. 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  8. 【java排序】 归并排序算法、堆排序算法

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  9. java实现归并排序算法

    归并排序算法思想:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.第二, 治理: ...

随机推荐

  1. Android 开发项目笔记2 自建View满足特殊要求

    写java文件组成特殊的View,然后在xml文件中通过 包名.类名 调用. 1.padding 是指的组件内部的填充区域,不是指组件与parent之间的区域.操控后者间距后者使用margin 2.使 ...

  2. URL重写无效

    在IIS7或以上版本中使用urlrewriter时会出现无效的现像,这时候需要使用以下设置

  3. java异常捕获

    类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断: try { throw new ExampleB("b") } catch(E ...

  4. [计算机故障]windows8+IE11显示无法登陆网页

    同事的一款SURFACE,跑的WINDOWS 8.1.最近发现从开始菜单里的win8.1的浏览器可以上网,但是通过任务栏的快捷方式,又上不了网.尝试重置了IE11,安装了Google Chrome.但 ...

  5. 微信 {"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"}

    {"errcode":,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]" ...

  6. 极光推送Jpush(v3)服务端PHP版本的api脚本类

    原文地址:http://www.dodobook.net/php/780 关于极光推送的上一篇文章已经说明了,此处就不多说了.使用v3版本的原因是v2使用到2014年年底就停止了.点击查看上一篇的地址 ...

  7. 简单的Markdown功能实现——marked模块的使用

    marked是一个markdown 解析.编译器,通过引入marked模块,可以实现一个简单的markdown编辑器.使用方式如下: Install 新建一个项目文件夹,在项目中下载marked模块 ...

  8. 远程连接服务器for Linux

    远程连接Linux云服务器-命令行模式 1.远程连接工具.目前Linux远程连接工具有很多种,您可以选择顺手的工具使用.下面使用的是名为Putty的Linux远程连接工具.该工具是免费的,且不需要安装 ...

  9. 在.net中调用Delphi dll的Pchar转换

    Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是De ...

  10. php字符截取

    mb_substr($str,0,2) 0 索引的位置  2 长度 mb_substr($str,0,-1) 最后一位如果是负数 表示从前面0开始到后面-1 0,-1都是索引