您的位置:首页 > 编程语言 > Java开发

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

2017-12-06 20:31 344 查看

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


运行结果如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐