归并排序算法 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. LinkedList实现队列和堆栈的代码

    package 集合; import java.util.LinkedList; /* *队列:先进先出 *把romovelast改成romoveFirst就成了堆栈 先进后出 *  * */publ ...

  2. vmware克隆虚拟机后配置网络

    一件配置: rm -rf /etc/udev/rules.d/70-persistent-net.rules cd /etc/sysconfig/network-scriptsrm -rf ifcfg ...

  3. 浏览器对象模型BOM小结

    概念 BOM (Browser Object Model) 浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是window B ...

  4. NSDecimalNumber用于精度准确的计算

    在处理金额计算时,往往会涉及到小数,由于Double类型不准确,无法做到产品的要求.为了保证金额计算的准确性,建议使用NSDecimalNumber. 1.创建对象(常用的方法) // mantiss ...

  5. php多线程详解

    在说明多线程的题前,需要弄清楚以下几个问题 1,ts 和 nts的区别 Thread Safe和NoneThread Safe 先说windows的,在php官网,在windows区域有在文件下在有 ...

  6. C#编译执行过程

    前言 大家好,我是卫斯理(Wesley).喜欢武侠的朋友可能知道小说中也有个卫斯理,他是位冒险家,财力充沛,极富冒险精神,并且有着超强的好奇心,对奇异的事情总有"打破沙锅问到底"的 ...

  7. [lua]安卓ndk如何编译lua库

    这里说的lua库是标准lua库,不包含tolua,不包含cocos2dx的各种lua扩展,是干净的lua. 参考: http://stackoverflow.com/questions/1229965 ...

  8. Struts2与Ajax的整合

    整合: 导入jar包 sturts2-json-plugin-2.1.8.1.jar 说明: 在该jar包中有struts-plugin.xml文件 <struts>            ...

  9. SQL Server中事务、锁定和阻塞

    事务是什么 在SQL Server中事务是构成一个工作逻辑单元的一系列任务,也就说多个任务放在一起执行,这些任务要么全部执行成功,要么全部执行失败. 通过事务我们可以保证数据的完整性,例如:用户A给用 ...

  10. QMap

    #include <QCoreApplication> #include<QMap> #include<QDebug> int main(int argc, cha ...