JAVA实现排序算法(二):两种归并排序

JAVA实现排序算法(二):两种归并排序


自顶向下和自底向上归并排序

两种归并排序的介绍如图:




代码如下


package com.lx.sort;

import java.util.Arrays;
import java.util.Scanner;

/**        
 * @ProjectName:  [MyAlgorithm]   
 * @Package:      [com.lx.sort]    
 * @ClassName:    [Example]     
 * @Description:  [排序]     
 * @Author:       [刘翔]     
 * @CreateDate:   [2017年11月12日 下午9:00:14]     
 * @UpdateUser:   [刘翔]     
 * @UpdateDate:   [2017年11月12日 下午9:00:14]     
 * @UpdateRemark: [说明本次修改内容]    
 * @Version:      [v1.0]   
 *      
 */
public class Sort {
     private static String[] aux;   //归并所需要的辅助数组
    /**
     * @param @param args
     * @Description: TODO(归并排序的双头并进取小部分)
     */
    public static void Merge(String[] a, int low, int mid, int high) {

        int i = low;
        int j = mid + 1;
        //String[] aux = a;
        for (int k = low; k <= high ; k++) aux[k] = a[k];
        for (int k = low; k <= high; k++) {
            if (i > mid) {                            //左半边用尽取右半边元素
                a[k] = aux[j++];
            } else if (j > high) {                    //右半边用尽取左半边元素
                a[k] = aux[i++];
            } else if (less(aux[j], aux[i])) {        //右半边的当前元素小于左半边的当前元素取右半边元素
                a[k] = aux[j++];
            } else {                                 //右半边的当前元素大于等于于左半边的当前元素取左半边元素
                a[k] = aux[i++];
            }

        }


    }

    /**
     * @param @param args
     * @Description: TODO(自顶向下归并排序)
     */
    public static void MergeSort(String[] a) {
        aux = new String[a.length];
        MergeSort(a, 0, a.length - 1);
    }

    public static void MergeSort(String[] a, int low, int high) {
        int mid = low + ((high - low) / 2);
        if (high <= low) {return; }
            MergeSort(a, low, mid);
            MergeSort(a, mid+1, high);
            Merge(a, low, mid, high);

    }

    /**
     * @param @param args
     * @Description: TODO(自底向上归并排序)
     */
    public static void MergeBUSort(String[] a) {
        int N = a.length;
        aux = new String[N];
        for (int i = 1; i < N; i = i + i) {    //i表示子数组大小
            for (int low = 0; low < N - i; low = low + i + i) {    //low表示子数组的索引位置
                Merge(a, low, low + i - 1, Math.min(low + i + i - 1, N - 1));
            }
        }
    }
    /**
    * @Description: TODO(判断v是否比w小)
    * @param @param args    
    */
    private static boolean less(String v,String w) {
        return v.compareTo(w) < 0;
    }
    /**
    * @Description: TODO(交换字符i和j的位置)
    * @param @param args    
    */
    private static void exch(String[] a,int i,int j) {
        String t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    /**
    * @Description: TODO(用于打印当前序列)
    * @param @param args    
    */
    public static void show(String[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }
    /**
    * @Description: TODO(用于测试字符序列a[]是否有序)
    * @param @param args    
    */
    public static boolean isSorted(String[] a) {
        for (int i = 1; i < a.length; i++) {
            if (less(a[i],a[i-1])) {
                return false;
            }
        }
        return true;
    }

    /**
    * @Title: main
    * @Description: TODO(用于测试从键盘录入的一列字符是否有序)
    * @param @param args    
    */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要排序的字符序列,输入的字符序列格式为1,2,3...9");
        String str = sc.nextLine();
        String[] info = str.split(",");
        System.out.println("当前序列的顺序是:");
        show(info);
        System.out.println("对当前序列进行排序");
        //SelectSort(info);
        //InsertSort(info);
        //SelectSort(info);
        //MergeSort(info);
        MergeBUSort(info);
        System.out.println("现在序列的排序是:");
        show(info);
        if (isSorted(info)) {
            System.out.println("序列已经成功的进行了排序");
        } else {
            System.out.println("序列排序失败");
        }       
    }
}

运行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值