• java 算法基础之三合并排序法


    合并排序算法是用分治策略实现对N个元素进行排序的算法。其基本思想是:

    将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。

    重点:

    1.分治的实现 

    2.合并的实现 

    分治,就是把整个集合的元素一直除2化分,一直化为到没有两个元素开始合并。

    图:

    分治的时候比较简单,一直除2递归就行了,合并的时候为了方便就借助另一个变化的数组来接收交换的数组,

    合并的时候,两个指标i、j,把值比较小的放入temp数组中,然后放入那个值的那一边的指标自加,继续比较。一直把值合部排完合并为一个数组,然后把temp数组复制回到原来数组就可以进入下一个递归。

    完全代码由下:

    public class  Merge
    {
        //递归分成小部分
        public void merge_sort(int[] arrays,int start,int end){
            if(start<end){
                int m=(start+end)/2;
                merge_sort(arrays,start,m);
                merge_sort(arrays,m+1,end);
                combin_arrays(arrays,start,m,end);    
            }
        }
        //合并数组
        public void combin_arrays(int[] arrays,int start,int m,int end){
            int length=end-start+1;
            int temp[]=new int[length];//用来存放比较的数组,用完复制回到原来的数组
            int i=start;
            int j=m+1;
            int c=0;
            while(i<=m &&j<=end){
                if(arrays[i]<arrays[j]){
                    temp[c]=arrays[i];
                    i++;
                    c++;
                }else{
                    temp[c]=arrays[j];
                    j++;
                    c++;
                }
            }
            while(i<=m){
                temp[c]=arrays[i];
                i++;
            }
            while(j<=end){
            temp[c]=arrays[j];
            j++;
            }
            c=0;
            for(int t=start;t<=end;t++,c++){
                arrays[t]=temp[c];
            }
            snp(arrays);
        }
        //打印数组
        public void snp(int[] arrays){
            for(int i=0;i<arrays.length;i++){
            System.out.print(arrays[i]+" ");
            }
            System.out.println();
        }
        
        public static void main(String[] args) 
        {
            Merge m=new Merge();
            int a[]={5,4,10,8,7,9};
            m.merge_sort(a,0,a.length-1);
            
        }
    }

    由有不对之处请大家指出,谢谢

  • 相关阅读:
    表单小知识
    HTML列表,表格与媒体元素
    P1008 三连击
    打鱼晒网问题
    最小编辑距离算法
    算法设计与分析--01背包问题(动态规划法解决)
    文件读写函数
    C语言中数据输入输出到文件操作freopen()函数(1)
    输入输出框架(未完待续)
    阶乘1到阶乘n的和
  • 原文地址:https://www.cnblogs.com/hexiaochun/p/2670070.html
Copyright © 2020-2023  润新知