和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          考試分數排序的三種排序方式的比較

          考試分數排序是一種特殊的排序方式,從0分到最高分都可能有成績存在,如果考生數量巨大如高考,大量考生都在同一分數上,如果需要從低到高排序的話,很多同樣分數的成績也被比較了,這對排序結果是沒有意義的,因為同一分數不需要比較,對于這種情況如果使用傳統排序就會有浪費,如果先按分數建立好檔次,再把考生成績按分數放入檔次就可以了。下面分別列出了三種方案的代碼和比較結果:

          學生類:
          package com.junglesong;

          import java.util.ArrayList;
          import java.util.Collections;
          import java.util.List;
          import java.util.Random;


          public class Student implements Comparable{
              
          private String name;
              
          private int score;
              
              
          public Student(String name,int score){
                  
          this.name=name;
                  
          this.score=score;
              }

              
              
          public int compareTo(Object obj){
                  Student another
          =(Student)obj;        
                  
          return this.score-another.score;
              }

              
              
          public String toString(){
                  
          return "學生姓名="+name+" 分數="+score;
              }

              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public int getScore() {
                  
          return score;
              }


              
          public void setScore(int score) {
                  
          this.score = score;
              }

          }


          第一種傳統排序方案的代碼:
              public static void main(String[] args){
                  
          //-----------老排序方案-----------        
                  TimeTest oldSortTest=new TimeTest();
                  List
          <Student> scores=new ArrayList<Student>();
                  
                  Random random
          =new Random();
                  
          for(int i=0;i<1000*100;i++){
                      scores.add(
          new Student("學生"+i,random.nextInt(100)));
                  }

                  
                  
                  Collections.sort(scores);
                  
          /*for(Student student:scores){
                      System.out.println(student);
                  }
          */

                  oldSortTest.end(
          "老排序方案耗時");
              }

          第二種使用LinkedLinkedHashMap分檔排序:
          package com.junglesong;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.LinkedHashMap;
          import java.util.List;
          import java.util.Map;
          import java.util.Random;

          /**
           * 學生分數排序類(LinkedHashMap實現)
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-4
           
          */

          public class LinkedHashMapScoreSorter{
              
          /**
               * 學生成績單
               
          */

              
          private Map<Integer,List<Student>> scoreSheet;
              
              
          /**
               * 滿分分數
               
          */

              
          private final int maxScore; 
              
              
          /**
               * 構造函數
               * 
          @param MaxScore: 滿分分數
               
          */

              
          public LinkedHashMapScoreSorter(int MaxScore){
                  
          this.maxScore=MaxScore;
                  scoreSheet
          =new LinkedHashMap<Integer,List<Student>>();
                  
                  
          for(int i=0;i<=maxScore;i++){
                      List
          <Student> ls=new ArrayList<Student>();
                      scoreSheet.put(i, ls);
                  }

              }

              
              
          /**
               * 添加一個學生成績
               * 
          @param student
               
          */

              
          public void addStudent(Student student){
                  
          int score=student.getScore();
                  
          if(student.getScore()>maxScore){
                      
          return;
                  }

                  
                  List
          <Student> ls=scoreSheet.get(score);
                  ls.add(student);
              }

              
              
          /**
               * 得到從低到高的學生成績表
               *
               
          */

              @SuppressWarnings(
          "unchecked")
              
          public List<Student> getSortedScores(){
                  List
          <Student> retval=new ArrayList<Student>();
                  
                  Iterator it
          =scoreSheet.values().iterator();

                  
          while(it.hasNext()){
                      List
          <Student> ls=(List<Student>)it.next();
                      retval.addAll(ls);
                  }

                  
                  
          return retval;
              }

              
              
          public static void main(String[] args){
                  TimeTest sortTest
          =new TimeTest();
                  
          int maxScore=100;
                  LinkedHashMapScoreSorter sorter2
          =new LinkedHashMapScoreSorter(maxScore);
                  
                  Random random
          =new Random();
                  
          for(int i=0;i<1000*100;i++){
                      sorter2.addStudent(
          new Student("學生"+i,random.nextInt(maxScore+1)));
                  }

                  sortTest.end(
          "LinkedHashMap排序方案耗時");    
                  
                  List
          <Student> ls=sorter2.getSortedScores();
                  
          /*for(Student student:ls){
                      System.out.println(student);
                  }
          */

                  
              }

          }


          第三種使用數組實現分檔:
          package com.junglesong;

          import java.util.ArrayList;
          import java.util.List;
          import java.util.Random;

          import org.apache.log4j.Logger;

          /**
           * 學生分數排序類(數組實現)
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-4
           
          */

          public class ArrayScoreSorter{
              
              
          /**
               * 學生成績單
               
          */

              
          private List<Student>[] scoreSheet;
              
              
          /**
               * 滿分分數
               
          */

              
          private final int maxScore; 
              
              
          /**
               * 構造函數
               * 
          @param MaxScore: 滿分分數
               
          */

              @SuppressWarnings(
          "unchecked")
              
          public ArrayScoreSorter(int MaxScore){
                  
          this.maxScore=MaxScore;
                  scoreSheet
          =new ArrayList[this.maxScore+1];
                  
                  
          for(int i=0;i<=maxScore;i++){
                      scoreSheet[i]
          =new ArrayList<Student>();
                  }

              }

              
              
          /**
               * 添加一個學生成績
               * 
          @param student
               
          */

              
          public void addStudent(Student student){
                  
          int score=student.getScore();
                  
          if(student.getScore()>maxScore){
                      
          return;
                  }

                  
                  List
          <Student> ls=scoreSheet[score];
                  ls.add(student);
              }

              
              
          /**
               * 得到從低到高的學生成績表
               *
               
          */

              @SuppressWarnings(
          "unchecked")
              
          public List<Student> getSortedScores(){
                  List
          <Student> retval=new ArrayList<Student>();
                  
                  
          for(List<Student> ls:scoreSheet){
                      retval.addAll(ls);
                  }

                  
                  
          return retval;
              }

              
              
          public static void main(String[] args){
                  TimeTest sortTest
          =new TimeTest();
                  
          int maxScore=100;
                  ArrayScoreSorter sorter
          =new ArrayScoreSorter(maxScore);
                  
                  Random random
          =new Random();
                  
          for(int i=0;i<1000*100;i++){
                      sorter.addStudent(
          new Student("學生"+i,random.nextInt(maxScore+1)));
                  }

                  sortTest.end(
          "數組排序方案耗時");
                  
                  List
          <Student> ls=sorter.getSortedScores();
                  
          /*for(Student student:ls){
                      System.out.println(student);
                  }
          */

                  
              }

          }


          比較結果如下:
          2008-03-10 20:53:52,218  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 453毫秒
          2008-03-10 20:53:56,140  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 438毫秒
          2008-03-10 20:53:59,031  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 453毫秒
          2008-03-10 20:54:02,000  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 485毫秒
          2008-03-10 20:54:04,453  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 453毫秒
          2008-03-10 20:54:07,421  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 437毫秒
          2008-03-10 20:54:10,531  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 437毫秒
          2008-03-10 20:54:13,359  INFO [main] (TimeTest.java:28- LinkedHashMap排序方案耗時 453毫秒
          2008-03-10 20:54:20,250  INFO [main] (TimeTest.java:28- 老排序方案耗時 500毫秒
          2008-03-10 20:54:23,421  INFO [main] (TimeTest.java:28- 老排序方案耗時 485毫秒
          2008-03-10 20:54:26,812  INFO [main] (TimeTest.java:28- 老排序方案耗時 500毫秒
          2008-03-10 20:54:30,093  INFO [main] (TimeTest.java:28- 老排序方案耗時 515毫秒
          2008-03-10 20:54:32,968  INFO [main] (TimeTest.java:28- 老排序方案耗時 500毫秒
          2008-03-10 20:54:35,906  INFO [main] (TimeTest.java:28- 老排序方案耗時 516毫秒
          2008-03-10 20:54:38,953  INFO [main] (TimeTest.java:28- 老排序方案耗時 516毫秒
          2008-03-10 20:54:41,796  INFO [main] (TimeTest.java:28- 老排序方案耗時 515毫秒
          2008-03-10 20:54:45,671  INFO [main] (TimeTest.java:28- 老排序方案耗時 500毫秒
          2008-03-10 20:54:48,921  INFO [main] (TimeTest.java:28- 老排序方案耗時 500毫秒
          2008-03-10 20:54:56,500  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:54:59,250  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:55:01,921  INFO [main] (TimeTest.java:28- 數組排序方案耗時 437毫秒
          2008-03-10 20:55:05,281  INFO [main] (TimeTest.java:28- 數組排序方案耗時 438毫秒
          2008-03-10 20:55:08,484  INFO [main] (TimeTest.java:28- 數組排序方案耗時 438毫秒
          2008-03-10 20:55:11,250  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:55:14,234  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:55:17,312  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:55:20,546  INFO [main] (TimeTest.java:28- 數組排序方案耗時 437毫秒
          2008-03-10 20:55:24,500  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:55:27,640  INFO [main] (TimeTest.java:28- 數組排序方案耗時 437毫秒
          2008-03-10 20:55:30,750  INFO [main] (TimeTest.java:28- 數組排序方案耗時 422毫秒
          2008-03-10 20:55:34,171  INFO [main] (TimeTest.java:28- 數組排序方案耗時 421毫秒

          結果不難預料,數組方案平均最低,LinkedHashMap次之,因為它還要花時間產生hashCode,傳統排序最低,因為對相同數據進行比較無謂的浪費了時間。

          程序下載:
          http://www.aygfsteel.com/Files/junglesong/ScoreSorter20080310212653.rar

          posted on 2008-03-10 21:20 和風細雨 閱讀(1392) 評論(0)  編輯  收藏 所屬分類: 算法

          主站蜘蛛池模板: 娄烦县| 泰宁县| 镇平县| 突泉县| 温宿县| 福安市| 文山县| 革吉县| 全南县| 确山县| 都兰县| 岗巴县| 贵阳市| 德兴市| 朝阳县| 蛟河市| 新晃| 大邑县| 淄博市| 柳林县| 田东县| 英超| 建始县| 泊头市| 贵阳市| 庆元县| 蒙自县| 鄂托克旗| 清苑县| 鹿邑县| 衡山县| 和田县| 东台市| 色达县| 仲巴县| 镇原县| 册亨县| 汉源县| 珠海市| 肥城市| 兴化市|