zoukankan      html  css  js  c++  java
  • 排序算法---归并排序

    将两个或者两个以上的有序表组合成一个新的有序表

    无论是顺序存储还是链式存储,都能在O(m+n)的时间量级上完成

    稳定O(nlogn)

    分治策略   递归

    2-路归并排序:将一维数组中前后相邻的两个有序序列归并为一个有序序列

        public static void mergeSort(int[] array){
            int temp[] = new int[array.length];    //和待排序序列等长的数组,用于在排序过程中临时存储
            subMergeSort(array, 0, array.length-1, temp);
        }
        
        public static void subMergeSort(int[] array,int left,int right,int[] temp){
            //将待排序序列分成一个一个的子序列,直到子序列的长度为1,然后一步一步将子序列合并成一个一个有序的子序列,直到整体有序
            
            int mid = (left+right)/2;
            System.out.print("sub------"+left+"-"+mid+"-"+right+"---");listArray(array,left,right);
            
            if(left<right){    
                subMergeSort(array, left, mid, temp);
                subMergeSort(array, mid+1, right, temp);
                mergeSub(array, left, mid, right, temp);
            }
            
        }
        public static void mergeSub(int[] array,int left,int mid,int right,int[] temp){
            
            int i = left;//前面那个子序列的第一个元素的下标,前面子序列最后一个元素的下标为mid
            int j = mid+1;//后面那个子序列的第一个元素的下标,后面子序列的最后一个元素的下标为right
            int index = 0;//临时数组的下标
            //顺序表的合并
            //按照从小到大,将两个子序列的元素按照顺序临时存放在temp[]中
            while(i<=mid && j<=right){
                //两个子序列都没到最后一个元素,循环,当其中一个到最后一个元素时,while循环停止
                if(array[i]<=array[j]){
                    temp[index++] = array[i++];
                }else{
                    temp[index++] = array[j++];
                }
            }
            //上面while循环停止,将没到最后一个元素的那个子序列的后续元素加到已排序元素之后
            while(i<=mid){
                temp[index++] = array[i++];
            }
            while(j<=right){
                temp[index++] = array[j++];
            }
            //本次操作将原数组中下标从left到right的元素排成有序的了,因此,将这几个元素拷贝到原数组中,这样,操作完成之后,原数组中的状态就是最后结果
            index = 0;
            i=left;
            
            while(i<=right){
                array[i++] = temp[index++];
            }
            System.out.print("after merge--");listArray(array);
            
        }
    原始数据:49 38 65 97 76 13 27 49 
    sub------0-3-7---49 38 65 97 76 13 27 49 
    sub------0-1-3---49 38 65 97 
    sub------0-0-1---49 38 
    sub------0-0-0---49 
    sub------1-1-1---38 
    after merge--38 49 65 97 76 13 27 49 
    sub------2-2-3---65 97 
    sub------2-2-2---65 
    sub------3-3-3---97 
    after merge--38 49 65 97 76 13 27 49 
    after merge--38 49 65 97 76 13 27 49 
    sub------4-5-7---76 13 27 49 
    sub------4-4-5---76 13 
    sub------4-4-4---76 
    sub------5-5-5---13 
    after merge--38 49 65 97 13 76 27 49 
    sub------6-6-7---27 49 
    sub------6-6-6---27 
    sub------7-7-7---49 
    after merge--38 49 65 97 13 76 27 49 
    after merge--38 49 65 97 13 27 49 76 
    after merge--13 27 38 49 49 65 76 97 
    13 27 38 49 49 65 76 97 
  • 相关阅读:
    移动Web框架:jQuery Mobile VS Sencha Touch
    2011最具争议性文章:中国网页设计为什么这么烂?
    如何学习嵌入式linux[转]
    嵌入式linux,老手给新手的建议
    开发菜鸟应该知道的十件事
    C#中二进制、八进制、十六进制和十进制之间的相互转化问题
    使用splitter控件 将界面分成可以调整宽度的三个部分
    Mutex 类
    Java 发邮件
    Java Servlet介绍 2
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9558536.html
Copyright © 2011-2022 走看看