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

来源:互联网 发布:爱情电影推荐知乎 编辑:程序博客网 时间:2024/05/16 12:59

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("序列排序失败");        }           }}

运行结果如下

阅读全文
0 0
原创粉丝点击