合并排序-java

来源:互联网 发布:数据库试用 编辑:程序博客网 时间:2024/05/23 12:01

转载请注明出处:http://blog.csdn.net/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));    }}


0 0