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();
    
        }
    
    }
  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4482945.html
Copyright © 2011-2022 走看看