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

    package com.cn.gao;
    //归并排序算法设计
    public class MergeSort {
        public static final int SIZE=15;
        /**
         * 合并一次算法
         * @param a 原数组
         * @param b 合并后存放数据数组
         * @param n    数组a中元素个数
         * @param len 有序元素的长度
         */
        public static void mergeOne(int[] a,int[] b,int n,int len){ 
            int i,j,k,l,m;
            i=0;
            while(i+len<n){
                j=i+2*len-1;
                if(j>=n){   //最后一段可能少于len个元素
                    j=n-1;
                }
                m=i;
                k=i;
                l=i+len;
                //合并相邻有序段
                while(i<k+len&&l<=j){
                    if(a[i]<=a[l]){
                        b[m++]=a[i++];
                    }else{
                        b[m++]=a[l++];
                    }
                }
                //将未合并的部分复制到数组b中
                while(i<k+len){
                    b[m++]=a[i++];
                }
                while(l<=j){
                    b[m++]=a[l++];
                }
                i=j+1;  //下一对有序段左段的开始下标
            }
            //将剩余的有序段加入b中
            if(i<n){
                for(;i<n;i++){
                    b[i]=a[i];
                }
            }
        }
        /**
         * 最终合并算法
         * @param a 原始数组
         * @param n 数组元素个数
         */
        public static void mergeSort(int a[], int n){
            int [] b = new int[n];
            int len=1,flag=0,count=0;
            while(len<n){
                if(flag==0){
                    mergeOne(a,b,n,len);    //合并到b中
                }
                if(flag==1){
                    mergeOne(b,a,n,len);   //合并到a中
                }
                flag=1-flag;
                len=2*len;
                count++;
                //输出每趟归并后的结果
                System.out.print("第"+count+"次排序的结果为:");
                for(int i=0;i<n;i++){
                    System.out.print(" "+(flag==0?a[i]:b[i]));
                }
                System.out.println();
            }
            if(flag==1){    //如果最后一步合并到b中
                for(int i=0;i<n;i++){
                    a[i]=b[i];
                }
            }
        }
        
        public static void main(String[] args) {
            int[] a = new int[SIZE];
            //为数组赋值
            for(int i=0;i<a.length;i++){
                a[i] = (int) (100 + Math.random()*100);
            }
            //输出排序前的数组
            System.out.println("排序前的数组为:");
            for(int i=0;i<a.length;i++){
                System.out.print(a[i]+" ");
            }
            System.out.println();
            //对数组排序
            mergeSort(a,SIZE);
            //输出排序后的数组
            System.out.println("排序后的数组为:");
            for(int i=0;i<a.length;i++){
                System.out.print(a[i]+" ");
            }
            System.out.println();
    
        }
    
    }
  • 相关阅读:
    常用函数
    小工具
    javascript实现的平方米、亩、公顷单位换算小程序
    在spring boot 项目中使用thymeleaf模板
    IntellJ IDEA 中JAVA代码的任务标记(TODO、FIXME、【XXX】)
    XMPP学习
    iOS绘图教程(个人学习总结)
    iOS: #ifdef DEBUG
    iphone sdk版本宏
    xmpp
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4482945.html
Copyright © 2011-2022 走看看