转载请注明出处:http://blog.youkuaiyun.com/lx1848/article/details/51408085
1. 创建一个类SortAlgorithm.java,然后将以下代码复制进去。
2. 在同一目录下创建文件DATA2,在里面保存待排序的数,以空格分割。
至于合并排序的理论就不多说了,类似文章很多。
合并排序算法的主要内容是在嵌套类MergeSort中。
拓展:如果要求这些数据中的逆序对数,你能借助合并排序求出来吗?tips: 在方法merge中考虑。
package sorting;
import java.io.*;
import java.util.Arrays;
/**
* Created by lx on 2016/5/14.
*/
public class SortAlgorithm {
static class MergeSort {
public static void mergeSort(Comparable a[], int left, int right) {
if(a == null) {
throw new NullPointerException("input a is null");
}
if(left > right || left < 0 || right >= a.length) {
System.err.println("Usage: mergeSort(a, left, right), in which 0 <= left < right <= a.length-1 ");
return;
}
if(left < right) {
Comparable b[] = new Comparable[right-left+1];
//int i = (left + right) / 2;
//avoid i is too large that out range of int
int i = (left+right) >> 1;
mergeSort(a,i+1,right);
mergeSort(a,left,i);
merge(a,b,left,i,right);
copy(a,b,left,right);
}
}
//merge two into b
public static void merge(Comparable a[],Comparable b[], int left, int mid, int right) {
int i, j, k = 0;
i = left;
j = mid+1;
while (i <= mid && j <= right) {
if(a[i].compareTo(a[j]) > 0) {
b[k++] = a[j++];
} else {
b[k++] = a[i++];
}
}
while (i <= mid) {
b[k++] = a[i++];
}
while (j <= right) {
b[k++] = a[j++];
}
}
//copy b back to a
public static void copy(Comparable a[],Comparable b[], int left, int right) {
int j = 0;
//while(j < b.length)
while(j < (right-left + 1)) {
a[j+left] = b[j++];
}
}
}
public static Integer[] readData() {
Comparable[] a = null;
try {
//文件DATA2中保存的是待排序的数据,以空格隔开
FileReader fr = new FileReader(new File(".\\DATA2"));
BufferedReader br = new BufferedReader(fr);
StringBuilder stringBuilder = new StringBuilder();
String str;
while((str = br.readLine()) != null) {
stringBuilder.append(str + " ");
}
String[] temp = stringBuilder.toString().split("\\s+");
a = new Integer[temp.length];
int i = 0;
while (i < temp.length) {
a[i] = Integer.parseInt(temp[i]);
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return (Integer[])a;
}
public static void main(String[] args) {
//Integer a[] = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };
Integer[] a;
a = readData();
MergeSort demo = new MergeSort();
//各种输入测试
//a = null
// demo.mergeSort(null,0,100);
//left > right
// demo.mergeSort(a, a.length-1, 0);
//left = right
// demo.mergeSort(a,a.length,a.length-1);
System.out.println("sorting " + a.length + " numbers: " + Arrays.toString(a));
demo.mergeSort(a,0,a.length-1);
System.out.println("sorted " + a.length + " numbers: " + Arrays.toString(a));
}
}