八大排序算法 之 归并排序
2016-05-07 10:40
369 查看
排序思想:
如图所示:
![](http://img.blog.csdn.net/20160507102945430?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
排序趟数:如果2^n<length<2^n+1,则循环趟数是:n+1
如此例,length = 9 > 8,趟数是4.
排序原理:
1,第一趟将相邻两个数归并成一个有序的小组合;
2,第二趟将相邻两个有序小组合归并成一个更大的的有序组合;
3,依次类推,直到将所有数归并成一个最大的组合;
具体代码实现如下:
如图所示:
排序趟数:如果2^n<length<2^n+1,则循环趟数是:n+1
如此例,length = 9 > 8,趟数是4.
排序原理:
1,第一趟将相邻两个数归并成一个有序的小组合;
2,第二趟将相邻两个有序小组合归并成一个更大的的有序组合;
3,依次类推,直到将所有数归并成一个最大的组合;
具体代码实现如下:
//归并排序主方法 public static void mergeSort(int[] array){ //拿出三个list作为工具完成归并 ArrayList<Integer> list1 = new ArrayList<Integer>(); ArrayList<Integer> list2 = new ArrayList<Integer>(); ArrayList<Integer> list3 = new ArrayList<Integer>(); for (int gap = 1; gap < array.length ; gap *= 2) {//运行趟数,每次将被归并的数组都会变大,直至完全归并为一个数组 for (int i = 0; i < array.length; i++) { if (list1.size() < gap) {//往第一个list里加数 list1.add(array[i]); }else if (list2.size() < gap){//往第二个list里加数 list2.add(array[i]); } if ((list1.size() == gap && list2.size() == gap) || (list1.size() == gap && list2.size() < gap && i == array.length - 1)) { merger(list1, list2, list3);//将前面两个list里的数归并后放入第三个list list1.clear();//清空第一个list循环使用 list2.clear();//清空第二个list循环使用 } } //将已达到目的的第三个list里的数复制到数组里,完成一趟排序; for (int i = 0; i < array.length; i++) { array[i] = list3.get(i); } list3.clear(); } }
//将两个有序的数组归并成一个有序的数组的方法:传入list1,list2,最后得到list3 public static void merger(ArrayList<Integer> list1, ArrayList<Integer> list2, ArrayList<Integer> list3){ int m = 0; int n = 0; while(m < list1.size() && n < list2.size()){ while (m < list1.size() && n < list2.size() && list1.get(m) < list2.get(n)) { list3.add(list1.get(m)); m ++; } while(m < list1.size() && n < list2.size() && list1.get(m) >= list2.get(n)){ list3.add(list2.get(n)); n ++; } } while (m < list1.size()) { list3.add(list1.get(m)); m ++; } while (n < list2.size()) { list3.add(list2.get(n)); n ++; } }
相关文章推荐
- JavaScript演示排序算法
- 算法之排序算法的算法思想和使用场景总结
- PHP版本常用的排序算法汇总
- JavaScript实现多种排序算法
- 举例讲解C语言对归并排序算法的基础使用
- java实现归并排序算法
- php 地区分类排序算法
- js三种排序算法分享
- Javascript中的常见排序算法
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
- 使用Java实现希尔排序算法的简单示例
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- 排序算法的javascript实现与讲解(99js手记)
- 图文详解Heap Sort堆排序算法及JavaScript的代码实现
- C++中十种内部排序算法的比较分析
- Java实现几种常见排序算法代码
- 浅谈javascript实现八大排序
- C语言演示对归并排序算法的优化实现
- PHP常用的排序和查找算法