第三周作业

来源:互联网 发布:fastboot软件多大 编辑:程序博客网 时间:2024/05/26 15:56
  1. import java.io.BufferedReader;  
  2. import java.io.File;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileReader;  
  5. import java.io.FileWriter;  
  6. import java.io.IOException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. public class Sort {  
  11.     /** 
  12.      * @param data:数组 
  13.      * @param firstBegin:第一个有序表的起始下标 
  14.      * @param secBegin:第二个有序表的起始下标 
  15.      * @param secEnd:第二个有序表的终止下标 
  16.      */  
  17.     private static void merge (Object[] data, int firstBegin, int secBegin, int secEnd) {  
  18.         Object[] temp = new Object[secEnd - firstBegin + 1];  
  19.         int i = firstBegin, j = secBegin, current = 0;  
  20.           
  21.         //第一个有序表的当前匹配下标在[firstBegin, secBegin)  
  22.         //第二个有序表的当前匹配下标在[secBegin, secEnd]  
  23.         while (i < secBegin && j <= secEnd) {  
  24.             if ((Integer)data[i] <= (Integer)data[j]) {  
  25.                 temp[current] = data[i];  
  26.                 current++;  
  27.                 i++;  
  28.             } else {  
  29.                 temp[current] = data[j];  
  30.                 current++;  
  31.                 j++;  
  32.             }  
  33.         }  
  34.           
  35.         //第一个有序表的当前匹配下标在[firstBegin, secBegin),则将后面的元素直接添加在temp表的后面,无序再进行比较  
  36.         while (i < secBegin) {  
  37.             temp[current] = data[i];  
  38.             current++;  
  39.             i++;  
  40.         }  
  41.           
  42.         //第二个有序表的当前匹配下标在[secBegin, secEnd],则将后面的元素直接添加在temp表的后面,无序再进行比较  
  43.         while (j <= secEnd) {  
  44.             temp[current] = data[j];  
  45.             current++;  
  46.             j++;  
  47.         }  
  48.           
  49.         //将匹配好的数据覆盖回data表中原来的位置  
  50.         System.arraycopy(temp, 0, data, firstBegin, temp.length);  
  51.     }  
  52.   
  53.     /** 
  54.      * @param data:数据数组 
  55.      * @param length:每个有序表的长度 
  56.      */  
  57.     private static void  mergeSort(Object[] data, int length) {  
  58.         if (data.length / length == 1) {  
  59.             return;  
  60.         }  
  61.         /** 
  62.          * size:当前两个有序表的总个数 
  63.          * compareTime:每两个相邻的有序表比较为一次,总共的比较次数 
  64.          * remainder:表示两个有序表总数按照size来划分,最终剩下的个数 
  65.          */  
  66.         int size = length * 2;  
  67.         int compareTimes = data.length / size;  
  68.         int remainder = data.length % size;  
  69.         int firstBegin=0, secBegin=0, secEnd=0;  
  70.           
  71.         for (int i=0; i<compareTimes; i++) {  
  72.             firstBegin = i * size;  
  73.             secBegin = firstBegin + length;  
  74.             secEnd = secBegin + length- 1;  
  75.             merge(data, firstBegin, secBegin, secEnd);  
  76.         }  
  77.           
  78.         //如果剩余的个数不为0,则将剩余的元素加入最后的一个有序表中进行排序  
  79.         if (remainder != 0) {  
  80.             secEnd = data.length - 1;  
  81.             secBegin = data.length - remainder;  
  82.             merge(data, firstBegin, secBegin, secEnd);  
  83.         }  
  84.           
  85.         mergeSort(data, length*2);  
  86.     }  
  87.       
  88.     /** 
  89.      * 获取文件的数据 
  90.      */  
  91.     private static List<Integer> getData() {  
  92.         BufferedReader reader;  
  93.         List<Integer> data = null;  
  94.         try {  
  95.             File file = new File("src/largeW.txt");  
  96.             reader = new BufferedReader(new FileReader(file));  
  97.               
  98.             data = new ArrayList<Integer>();  
  99.             String temp = reader.readLine();  
  100.             while (temp != null) {  
  101.                 data.add(Integer.valueOf(temp.trim()));  
  102.                 temp = reader.readLine();  
  103.             }  
  104.           
  105.         } catch (FileNotFoundException e) {  
  106.             e.printStackTrace();  
  107.         }  catch (IOException e) {  
  108.             e.printStackTrace();  
  109.         }  
  110.           
  111.         return data;  
  112.     }  
  113.       
  114.     /** 
  115.      * 冒泡排序 
  116.      */  
  117.     private static long bubbleSort(List<Integer> data) {  
  118.         long beginTime = System.currentTimeMillis();  
  119.         int amount = data.size();  
  120.           
  121.         for (int i=0; i<amount-1; i++) {  
  122.             for  (int j=0; j<amount-i-1; j++) {  
  123.                 if (data.get(j) < data.get(j+1)) {  
  124.                     int temp = data.get(j);  
  125.                     data.set(j, data.get(j+1));  
  126.                     data.set(j+1, temp);  
  127.                 }  
  128.             }  
  129.         }  
  130.           
  131.         long endTime = System.currentTimeMillis();  
  132.         return endTime-beginTime;  
  133.     }  
  134.       
  135.     /** 
  136.      * function: 
  137.      * 0:代表冒泡排序 
  138.      * 1:代表归并排序 
  139.      */  
  140.     private static void write2File(Object[] data, int function) {  
  141.         FileWriter output = null;  
  142.         try {  
  143.             if (function == 0) {  
  144.                 output = new FileWriter(new File("src/largeW_bubble.txt"));  
  145.             } else {  
  146.                 output = new FileWriter(new File("src/largeW_merge.txt"));  
  147.             }  
  148.                   
  149.             for (int i=0; i<data.length; i++) {  
  150.                 Integer integer = (Integer)data[i];  
  151.                 output.write(integer + "\n");  
  152.             }  
  153.               
  154.             output.flush();  
  155.         } catch (FileNotFoundException e) {  
  156.             e.printStackTrace();  
  157.         } catch (IOException e) {  
  158.             e.printStackTrace();  
  159.         } finally {  
  160.             try {  
  161.                 output.close();  
  162.             } catch (IOException e) {  
  163.                 e.printStackTrace();  
  164.             }  
  165.         }  
  166.     }  
  167.       
  168.     public static void main(String[] args) {  
  169.         long beginTime, stopTime;  
  170.         List<Integer> dataList = getData();  
  171.         Object[] dataArray = dataList.toArray();  
  172.           
  173.         //冒泡排序  
  174.         beginTime = System.currentTimeMillis();  
  175.         bubbleSort(dataList);  
  176.         stopTime = System.currentTimeMillis();  
  177.         System.out.println("冒泡排序总用时:"  + (stopTime - beginTime));  
  178.         write2File(dataList.toArray(), 0);  
  179.           
  180.         //归并排序  
  181.         beginTime = System.currentTimeMillis();  
  182.         mergeSort(dataArray, 1);  
  183.         stopTime = System.currentTimeMillis();  
  184.         System.out.println("归并排序总用时:"  + (stopTime - beginTime));  
  185.         write2File(dataArray, 1);  
  186.     }  
  187. }  



0 0
原创粉丝点击