关闭

java 实现二分归并排序

标签: javastring函数归并排序合并
4784人阅读 评论(0) 收藏 举报
分类:

首先 解释一下什么是归并排序的精髓就是把一个乱序数组划分成小的数组来排序,然后再把小的数组合并成大的小组,下面的这张图能够明确说明什么是归并排序

虽然看图感觉二路归并排序很简单,但是实际操作起来还是有一点麻烦的

这是主函数

public static void main(String[] args) {
        int[] array = new int[] { 10, 9, 5, 11, 45, 23, 2, 13 };
        splitArray(array, 0, array.length - 1);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }

    }
    private static void sort(int[] array, int left, int mid, int right) {
        int[] leftArray = new int[mid-left];//第一个数组的长度
        int[] rightArray = new int[right - mid + 1];//第二个数组的长度
        int i = 0, j = 0, k = 0;
        for (i = left; i < mid; i++)//将最传进来大的数组分成两个小的数组,分别为LeftArray与RightArray
            leftArray[i - left] = array[i];
        for (i = mid; i <= right; i++)
            rightArray[i - mid] = array[i];
        i = 0;
        j = 0;
        k = left;
        while (i < mid - left && j < right - mid + 1) {//任意一个不满足条件即可退出
            /*
             * 这里就是把两个数组有序的合在一起的精髓,将第一个数组的第一个元素与第二个数组的第一个元素相比较,如果第一个数组的元素是小的就讲这个值复制给最大的数组的第一位
             * 然后最大数组与复制给最大数组的数组下标都自加
             */
            if (leftArray[i] < rightArray[j]) {
                array[k++] = leftArray[i++];

            } else {
                array[k++] = rightArray[j++];

            }

        }
    /*
     * 上面的while循环跳出 检查将后面的没有排完的值全部加给最大的数组
     */
        while (i < mid - left) {
            array[k++] = leftArray[i++];
        }
        while (j < right - mid + 1) {
            array[k++] = rightArray[j++];
        }

    }

这里就是合并了,把两个数组合并为一个数组

然后我们看最为核心的东西

private static void splitArray(int[] array, int left, int right) {

        if (left == right) {
            return;
        } else {
            int mid = (right + left) >> 1;//得到中间值
            splitArray(array, left, mid);//处理左边的数组
            splitArray(array, mid+1, right);//处理右边的数组
            sort(array, left, mid+1 , right);//归并

        }
    }

在这里将传递进来的左边与右边分别是最大数组的最大下标与最小下标,将他们除2 我们就可以得到他的中间值,然后递归第一个递归是处理左边的数组将左边的数组分割,第二个递归是处理右边的递归,第三个递归就是调用第二个sort函数将他们排序并且组合在一起

也许在三个递归你会感觉到理解有点困难,我们来debug 调试一下你就会发现他的规律了

这里写图片描述
这里写图片描述

End!!!!

3
0
查看评论

二路归并(JAVA实现)

/** * Created by DELL on 2017/4/23. * 二路归并 */ public class ErLuGuiBInSort { public static void main(String[] args){ int[] in = {46,12,3...
  • jane_fast
  • jane_fast
  • 2017-04-24 00:58
  • 299

java 二分排序

package com.guxia; public class Test { public static void main(String[] args) { int []a={4,2,1,6,3,6,0,-5,1,1}; int i,j; int low,hig
  • wustrive_2008
  • wustrive_2008
  • 2011-09-28 15:03
  • 4827

二分排序(java)

基本思想就是:将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。package com.suanfa; /** * 二分排序 * @author Administrator * */ public class Merge ...
  • baidu_23086307
  • baidu_23086307
  • 2016-05-30 14:42
  • 1074

java 实现二分查找法

二分查找又称折半查找,它是一种效率较高的查找方法。   【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。/** * 二分查找又称折半查找,它是一种效率较高的查找方法。   【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。 * @author Adm...
  • jiandanfeng2
  • jiandanfeng2
  • 2011-06-03 17:15
  • 69309

基础算法(三)---二分排序(Java)

目前主流的二分排序是:折半插入排序
  • Wee_Mita
  • Wee_Mita
  • 2017-06-12 15:23
  • 344

java排序、冒泡、二分、插入、选择等排序方法分析

  • 2012-07-18 13:59
  • 3KB
  • 下载

温故而知新-java排序与二分查找

java中自身就有一个函数把数组从小到大排序,也可以用二分查找一个数据是否在一个已排好的数组中。     Array类调用:     public static void sort(double a[])     可以把a数组按升序排...
  • u012882327
  • u012882327
  • 2015-03-09 22:01
  • 744

Java 实现二分(折半)插入排序

设有一个序列a[0],a[1]...a[n];其中a[i-1]前是已经有序的,当插入时a[i]时,利用二分法搜索a[i]插入的位置 效率:O(N^2),对于初始基本有序的序列,效率上不如直接插入排序;对于随机无序的序列,效率比直接插入排序要高 /* * 二分(折半)插入排序 * 设有一个序列a[...
  • jjwwmlp456
  • jjwwmlp456
  • 2014-10-17 12:31
  • 4788

在java用二分查找法实现对数组的排序

二分查找法:前提是数组中的元素要有序,这里只贴自己的图片,至于代码要靠自己写了,毕竟单纯的复制粘贴而不去思考对学习一点用处都没有: 实际上数组已经自带了一个排序算法: Arrays.sort(数组名)为数组排序的操作,但这个方法在java.util这个包里面,所以在用到的时候需要先将它导入, ...
  • Chen_dSir
  • Chen_dSir
  • 2016-12-05 23:03
  • 1612

七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)

冒泡排序 思路:就是每次将最大或最小的元素放到数组的最后,so easy!时间复杂度为(O(n^2)) public class BubbleSort { public static void bubbleSort(int[] a) { for (int j = 1; j < a.len...
  • oChenXiaoZuo1
  • oChenXiaoZuo1
  • 2014-04-30 18:46
  • 2321
    个人资料
    • 访问:112490次
    • 积分:1389
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论