排序

来源:互联网 发布:python 列表转元组 编辑:程序博客网 时间:2024/06/05 08:54

归并排序
采用分而治之的策略,时间复杂度为N*log(N),是非常优秀的排序算法。
代码如下:

package com.time.before.test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.OutputStreamWriter;import java.util.Random;public class MegreSort2 {    public static Comparable[] aux ;    public static void sort(Comparable[] a){        aux = new Comparable[a.length];        sort(a, 0, a.length -1);    }    public static void sort(Comparable[] a, int low, int high){        if(low >= high) return;        int mid = low + (high - low) / 2 ;        sort(a, low, mid);        sort(a, mid + 1, high);        merge(a, low, mid, high);    }    public static void main(String[] args) throws FileNotFoundException{        buildData();        FileReader fr = new FileReader("D:\\data.txt");        BufferedReader br = new BufferedReader(fr);        try {            String line = br.readLine();            String[] datas = line.split(",");            Comparable[] a = new Comparable[datas.length];            for(int i = 0; i < datas.length; i++) a[i] = Integer.parseInt(datas[i]);            long t = System.currentTimeMillis();            MegreSort2.sort(a);            long sortTime = (System.currentTimeMillis() - t);             System.out.println(sortTime);            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\sortData.txt"),"utf-8"));            int i = 0;            while(i < a.length){                bw.write(a[i] + ",");                i +=1;            }            bw.flush();            bw.close();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }//      MegreSort2.sort(a);//      MegreSort2.buildData();    }    public static void merge(Comparable[] a, int low, int mid, int high){        int i = low, j = mid + 1;//      System.out.println(i + "\t" + mid + "\t" + high);        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 ++];        }    }    public static boolean less(Comparable v, Comparable w){        return v.compareTo(w) < 0;    }    public static void buildData() throws FileNotFoundException{        try{//          FileWriter writer = new FileWriter("D:\\data.txt", true);            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\data.txt"),"utf-8"));//          FileOutputStream fos = new FileOutputStream("D:\\data.txt", true);            int i = 0;            Random ra = new Random();//          System.out.println(ra.nextInt(1000000));            while(i <= 100000000){                bw.write(ra.nextInt(100000000) + ",");                i +=1;            }            bw.flush();            bw.close();        }catch(Exception e){        }    }}

写完归并排序后,做了一个小测试,本机内存8G,随机生成1百万个整数,排序时间在1s左右,想进一步测试一亿个整数的排序时间,生成的数据文件大小为847m,出现了java堆溢出问题,设置java参数-Xms和-Xmx时,发现本地内存不够用(原因还未知),只好放弃

快速排序
快排的思想是随机在数组中选一个数,比如数组的第一个值,把该值放到正确的位置,保证该值左边的子数组都小于等于它,右边的子数组的值都大于等它。快排的时间复杂度为O(nlogn)。最换的情况为O(n2)。和归并排序的时间复杂度一样,但是少了新增一个数组内存的开销。
代码如下:

package com.time.before.test;public class QuickSort {    public static void main(String[] args){        Comparable[] a = {2,1,7,1,6,3,18,21,23,12,190,156,156} ;        quickSort(a, 0, a.length -1);        for(int i = 0; i < a.length; i++){            System.out.println(a[i]);        }    }    private static void quickSort(Comparable[] a, int low, int high) {        if(high <= low) return;        int j = partition(a, low, high);        quickSort(a, low, j - 1);        quickSort(a, j + 1, high);    }    private static int partition(Comparable[] a, int low, int high) {        int i = low, j = high +1;        Comparable v = a[low];        while(true){            while(less(a[++ i], v))                if(i == high)                     break;            while(less(v, a[--j]))                if(j == low)                     break;            if(j <= i)                 break;            exch(a, i, j);        }        exch(a, low, j);        return j;    }    private static void exch(Comparable[] a, int i, int j) {        Comparable t = null;        t = a[i];        a[i] = a[j];        a[j] = t;    }    public static boolean less(Comparable v, Comparable w){        return v.compareTo(w) < 0;    }}
0 0
原创粉丝点击