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

    原创


    先来看将两个有序数组合并成一个有序数组是如何操作的;

    设有序数组为a和b,结果数组c;

    int k=0;
    while(i<=a.length-1 && j<=b.length-1){
        if(a[i]<b[j]) {
            c[k++]=a[i++];
        }
        else {
            c[k++]=b[j++];
        }
    }
    while(i<=a.length-1) {
        c[k++]=a[i++];
    }
    while(j<=b.length-1) {
        c[k++]=b[j++];
    }

    归并排序的思想用的是分治法,假设待排序数组为array[n],再新建一个辅助数组array1[n]。

    通过不断的将数组array进行递归折半(int mid=(left+right)/2),最后rihgt==left,将元素array[left]放入辅助数组array1中;

    递归回来,递归进去(mid+1,right),最后left==right,再将元素array[left]放入辅助数组array1中;

    此时辅助数组有两个元素,用上面的合并算法合并到array中完成一个2路归并,再递归回来排序右边的。。。

    import java.util.*;
    
    public class 归并排序 {
        
        static void Merge(int array[],int array1[],int s,int m,int t) {    //合并两个已排序好的子序列
            int i=s;
            int j=m+1;
            int k=s;
            while(i<=m && j<=t) {
                if(array[i]<array[j]) {    //将较小者放入array1
                    array1[k++]=array[i++];
                }
                else {
                    array1[k++]=array[j++];
                }
            }
            while(i<=m) {
                array1[k++]=array[i++];
            }
            while(j<=t) {
                array1[k++]=array[j++];
            }
            //合并完毕后更新辅助数组的值
            for(int z=s;z<=t;z++) {
                array[z]=array1[z];
            }
        }
        
        static void MergeSort(int array[],int array1[],int s,int t) {
            if(s==t) {
                array1[s]=array[s];
            }
            else {
                int m=(s+t)/2;    //折半
                MergeSort(array,array1,s,m);    //合并前半段
                MergeSort(array,array1,m+1,t);    //合并后半段
                Merge(array1,array,s,m,t);
            }
            
        }
    
        public static void main(String[] args) {
            Scanner reader=new Scanner(System.in);
            System.out.print("Input the size of array:");
            int n=reader.nextInt();
            int array[]=new int[n];
            int array1[]=new int[n];    //辅助数组
            System.out.print("Input the element of array:");
            for(int i=0;i<n;i++) {
                array[i]=reader.nextInt();
            }
            MergeSort(array,array1,0,n-1);
            for(int i=0;i<n;i++) {
                System.out.print(array[i]+" ");
            }
        }
    
    }

    15:56:29

    2018-10-04

  • 相关阅读:
    JS绑定种类汇总
    JS的块级作用域
    JS中的几种函数
    区分词法作用域(js)与动态作用域(精!)
    JS Dom节点操作demo!
    JS作用域相关知识(#精)
    js解析器(重要!)
    JS之鼠标在盒子中的位置
    JS之鼠标跟随
    JS之事件对象体验
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9742411.html
Copyright © 2011-2022 走看看