首页 > 代码库 > 简单排序(java)

简单排序(java)

技术分享
package test;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;//import java.util.Scanner;/** * Notice: * <BR> 1. 仅限使用以下package: *        java.lang.*, java.io.*, java.math.*, java.text.*, java.util.* * <BR> 2. 请勿变更 package名,类名,test()定义。  * */public class ProgramTest {    /**     * 请在此方法内完成代码,但可以增加自己的私有方法。     * 数据文件inputFile的内容格式为一行一条数据,每条数据有2个字段用逗号分隔,第1个字段为排序用的Key,第二个字段为value。     * 换行符为‘\n‘。     * 数据内容举例如下:     * abe,xmflsflmfmlsmfs     * abc,xmlmxlkmffhf     * 8fj3l,xxjfluu313ooo11     *      * 注意点: 1.本次的测试数据内容都是ASCII字符,无中文汉字.所以不必考虑encoding。     *        2.本次的测试数据中,key的最大长度8,value的最大长度32。     *      * 排序以key的升序,使用String.compareTo()来比较key的大小。最后排序完成的数据写入outputFile。     * @param inputFile 输入文件     * @param outputFile 输出文件     * @param tempFile 临时文件。处理的数据量大的时候,可能会需要用到临时文件。     * @throws Exception     */        public static void test(File inputFile, File outputFile, File tempFile) throws Exception {        //TODO ====================== YOUR CODE HERE ======================        ProgramTest pt = new ProgramTest();        List<Item> l = new ArrayList<Item>();                //读输入文件        //Scanner sc = new Scanner(inputFile);        BufferedReader reader = null;        try {            reader = new BufferedReader(new FileReader(inputFile));            String str = null;            // 一次读入一行,直到读入null为文件结束            while ((str = reader.readLine()) != null)                 l.add(pt.new Item(str.split(",")));            reader.close();        } catch (IOException e) {            e.printStackTrace();        } finally {            if (reader != null) {                try {                    reader.close();                } catch (IOException e1) {                }            }        }//        //        while(sc.hasNext())//            l.add(pt.new Item(sc.next().split(",")));    //        sc.close();//                pt.items = l.toArray(new Item[l.size()]);                //归并排序        pt.mergeSort(0, l.size());                //输出文件        FileOutputStream out = new FileOutputStream(outputFile);//        pt.print("");        for(Item item : pt.items)            out.write(item.toByte());        out.close();        //        pt.print("排序前:");//        pt.mergeSort(0, l.size());//        pt.print("排序后:");    }            //TODO ====================== YOUR CODE HERE (You can add private method if need) ======================    /**     * 打印内存值     * @param str 提示信息     */    private void print(String str){        System.out.println(str);        for(Item item : items)            System.out.println(item.getKey() + "," + item.getValue());    }        /**     * 存储每行数据的数据结构     * @author kdping     *     */    private class Item{        private String key;        private String value;        Item(String[] arr){            key = arr[0];    value = http://www.mamicode.com/arr[1];        }        public String getValue() {            return value;        }        public void setValue(String value) {            this.value =http://www.mamicode.com/ value;        }        public String getKey() {            return key;        }        public void setKey(String key) {            this.key = key;        }        public int compareTo(Item item){            return this.key.compareTo(item.key);        }        public byte[] toByte(){            return (key+","+value).getBytes();         }    }        private Item[] items;        /**     * 归并两个有序序列,items[start,mid),items[mid,end)     * @param start       * @param end        */    private void merge(int start, int end){        int n = end - start;    int mid = (n >> 1) + start;        int k1 = start, k2 = mid, i = 0;        Item[] titems = new Item[n + 1];        while(k1<mid && k2<end){            if(items[k1].compareTo(items[k2]) < 0)                titems[i++] = items[k1++];                else titems[i++] = items[k2++];        }        while(k1 < mid) titems[i++] = items[k1++];        while(k2 < end) titems[i++] = items[k2++];        for(i = 0; i < n; i++) items[start++] = titems[i];    }    /**     * 对items(start,end]进行归并排序     * @param start     * @param end     */    private void mergeSort(int start, int end){        int n = end - start;        int mid = (n >> 1) + start;        if(n < 2) return;        mergeSort(start, mid);        mergeSort(mid, end);        merge(start, end);    }            /**      * 测试函数     * @param args     *///    public static void main(String[] args) {//        // TODO Auto-generated method stub//        File inputFile = new File("D:\\Download\\javatest\\javatest\\data\\in.txt");//        File outputFile = new File("D:\\Download\\javatest\\javatest\\data\\out.txt");//        File tmpFile = new File("D:\\Download\\javatest\\javatest\\data\\itdm.txt");//        try {//            //            test(inputFile, outputFile, tmpFile);//        } catch (Exception e) {//            // TODO Auto-generated catch block//            e.printStackTrace();//        }//    }        //=================================================================}
...

一道面试题:http://zhaopin.e-pointchina.com/zhaopintest/techtest_test_java.html?testId=zhaopin_java&qSetId=zhaopin_java_sort&qId=zhaopin_java_sort1

题目见代码,原来用Scanner类似乎会报访问权限不足。

结果超时,50万的数据,应该是时间花在磁盘IO上的原因。

简单排序(java)