SORT

轉自:http://yiyickf.iteye.com/blog/1047010


排序算法java版,速度排行:冒泡排序、簡單選擇排序、直接插入排序、折半插入排序、希爾排序、堆排序、歸併排序、快速排序

文章分類:Java編程

先推薦一篇關於排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html

本文思路部分來源於上篇文章,但測得的結果似乎不大相同,不知是因爲java的緣故還是因爲我算法的緣故,歡迎拍磚。

 

複習排序,順便比下各種算法的速度,榜單如下:

1、冒泡排序

2、簡單選擇排序

3、直接插入排序

4、折半插入排序

5、希爾排序

6、堆排序

7、歸併排序

8、快速排序

當然這是慢速排行,哈哈~~

 

 

直接上圖:單位毫秒

 

數量

冒泡排序

簡單選擇排序

直接插入排序

折半插入排序

希爾排序

堆排序

歸併排序

快速排序

10000

1578

1250

672

250

0

15

16

0

15000

3453

2765

1563

531

16

15

16

0

20000

6140

4547

2453

828

16

16

15

16

25000

10079

7171

3969

1313

31

16

15

16

30000

14641

10313

5578

1906

31

31

16

31

35000

20141

14328

7890

2563

31

31

32

15

40000

25766

18359

10094

3422

47

31

31

32

45000

32469

24063

13062

4359

47

47

31

47

 

 

由於"希爾排序","堆排序","歸併排序","快速排序"太快,以至於在上圖幾乎是條直線,故有了下面轉爲他們準備的加強版

 

數量

希爾排序

堆排序

歸併排序

快速排序

100000

172

140

110

93

200000

469

406

235

234

300000

812

703

422

375

400000

1125

1031

516

531

500000

1406

1282

719

656

600000

1828

1703

860

859

700000

2531

2063

1000

968

800000

2735

2453

1140

1188

900000

3047

2843

1391

1266

1000000

3375

3187

1516

1422

1100000

3922

3500

1625

1609

1200000

4421

3954

1969

1812

1300000

4797

4422

2000

1953

1400000

5391

4797

2547

2094

1500000

5437

5219

2625

2328

1600000

6203

5546

2469

2485

1700000

6532

5953

2844

2672

1800000

7125

6421

2984

2844

 

補上代碼:

 

Java代碼  收藏代碼
  1. import  java.util.ArrayList;  
  2. import  java.util.Arrays;  
  3. import  java.util.List;  
  4.   
  5. /**  
  6.  * 插入排序:直接插入排序、折半插入排序和系爾排序  
  7.  * 交換排序:冒泡排序和快速排序  
  8.  * 選擇排序:簡單選擇排序和堆排序  
  9.  * 歸併排序:歸併排序  
  10.  *   
  11.  * 基本思想  
  12.  * 插入排序:將第N個記錄插入到前面(N-1)個有序的記錄當中。  
  13.  * 交換排序:按照某種順序比較兩個記錄的關鍵字大小,然後根據需要交換兩個記錄的位置。  
  14.  * 選擇排序:根據某種方法選擇一個關鍵字最大的記錄或者關鍵字最小的記錄,放到適當的位置。  
  15.  *   
  16.  * 排序方法比較  
  17.  * 排序方法         平均時間        最壞時間         輔助存儲  
  18.  * 直接插入排序      O(N2)          O(N2)           O(1)  
  19.  * 起泡排序         O(N2)          O(N2)           O(1)  
  20.  * 快速排序         O(Nlog2N)      O(N2)           O(Nlog2N)  
  21.  * 簡單選擇排序      O(N2)          O(N2)           O(1)  
  22.  * 堆排序           O(Nlog2N)      O(Nlog2N)       O(1)  
  23.  * 歸併排序         O(Nlog2N)      O(Nlog2N)       O(n)  
  24.  * 基數排序         O(d(n+radix))  O(d(n+radix))   O(radix)  
  25.  *   
  26.  *   
  27.  *   
  28.  * @author Administrator  
  29.  *  
  30.  */   
  31. public   class  SortTest {  
  32.   
  33.     public   static   void  main(String[] args) throws  Exception {  
  34.         //測試排序是否正確   
  35.         //String[] testErr=new String[]{"冒泡排序","簡單選擇排序","直接插入排序","折半插入排序","系爾排序","堆排序","歸併排序","快速排序"};   
  36.         //new SortTest().testErr(testErr);   
  37.           
  38.         //排序1(全部)   
  39.         String[] strs=new  String[]{ "冒泡排序" , "簡單選擇排序" , "直接插入排序" , "折半插入排序" , "希爾排序" , "堆排序" , "歸併排序" , "快速排序" };  
  40.         new  SortTest().test(strs, 10000 , 50000 , 5000 );  
  41.           
  42.         //排序2(加強)   
  43.         String[] strs2=new  String[]{ "希爾排序" , "堆排序" , "歸併排序" , "快速排序" };  
  44.         new  SortTest().test(strs2, 100000 , 1900000 , 100000 );  
  45.           
  46.     }  
  47. private    void  testErr(String[] strings)  throws  Exception{  
  48.           
  49.         //System.out.println(Arrays.toString(old));   
  50.         System.out.println(Arrays.toString(strings));  
  51.           
  52.             Number[] old=getRundom(50 );  
  53.             Integer[] oo={1 , 2 , 3 , 3 , 2 , 21 , 5 , 6 , 7 , 78 , 5 , 65 , 8 , 7 , 6 , 6 , 6 , 6 , 6 , 9 , 56544 , 354 , 32 , 4 , 456 , 8 , 89 ,- 9 , 0 , 3 , 243 ,- 321 , 321 ,- 3 ,- 2 , 21 };  
  54.             old=oo;  
  55.             for (String s:strings){  
  56.                 Number[] testNum=Arrays.copyOf(old, old.length);  
  57.                 long  begin=System.currentTimeMillis();  
  58.                 SortTest.class .getMethod(s, Number[]. class ).invoke( this , (Object)testNum);  
  59.                   
  60.                 long  end=System.currentTimeMillis();  
  61.                 System.out.println(s+":" +(end-begin)+ "\t" );  
  62.                 System.out.println(Arrays.toString(testNum));  
  63.             }  
  64.             System.out.println();  
  65.           
  66.           
  67.     }  
  68.       
  69.     private    void  test(String[] strings, long  begin, long  end, long  step)  throws  Exception{  
  70.         System.out.print("數量\t" );  
  71.         for (String str:strings){  
  72.             System.out.print(str+"\t" );  
  73.         }  
  74.         System.out.println();  
  75.         for ( long  i=begin;i<end;i=i+step){  
  76.             System.out.print(i+"個\t" );  
  77.             Number[] old=getRundom(i);  
  78.             for (String s:strings){  
  79.                 Number[] testNum=Arrays.copyOf(old, old.length);  
  80.                 long  beginTime=System.currentTimeMillis();  
  81.                 SortTest.class .getMethod(s, Number[]. class ).invoke( this , (Object)testNum);  
  82.                   
  83.                 long  endTime=System.currentTimeMillis();  
  84.                 System.out.print((endTime-beginTime)+"\t" );  
  85.                 //System.out.println(Arrays.toString(testNum));   
  86.             }  
  87.             System.out.println();  
  88.         }  
  89.           
  90.     }  
  91.   
  92.     private   static  Integer[] getRundom( long  num) {  
  93.         List<Integer> list=new  ArrayList<Integer>();  
  94.         for ( long  i= 0 ;i<num;i++){  
  95.             int  k;  
  96.             if (Math.random()> 0.5 ){  
  97.                 k=(int )(Math.random()*Integer.MAX_VALUE);  
  98.             }else {  
  99.                 k=(int )(Math.random()*Integer.MIN_VALUE);  
  100.             }  
  101.             list.add(k);  
  102.         }  
  103.         return  list.toArray( new  Integer[list.size()]);  
  104.     }  
  105.       
  106.       
  107.       
  108.       
  109.     /**  
  110.      * 插入排序————直接插入排序  
  111.      * @param data  
  112.      */   
  113.     public   static    void   直接插入排序(Number[] data)  
  114.     {  
  115.         Number tmp=null  ;  
  116.           
  117.       for ( int  i= 1 ;i<data.length;i++){  
  118.           tmp = data[i];  
  119.           int  j=i- 1 ;  
  120.           while (j>= 0  && tmp.doubleValue()<data[j].doubleValue()){  
  121.               data[j+1 ]=data[j];  
  122.               j--;  
  123.           }  
  124.           data[j+1 ]=tmp;  
  125.       }  
  126.     }  
  127.     /**  
  128.      * 插入排序————折半插入排序  
  129.      * @param data  
  130.      */   
  131.     public   static    void   折半插入排序(Number[] data)  
  132.     {  
  133.         Number tmp=null  ;  
  134.           for ( int  i= 1 ;i<data.length;i++){  
  135.               tmp = data[i];  
  136.               int  smallpoint= 0 ;   
  137.               int  bigpoint=i- 1 ;  
  138.                   
  139.               while (bigpoint>=smallpoint){  
  140.                   int  mid=(smallpoint+bigpoint)/ 2 ;  
  141.                   if (tmp.doubleValue()>data[mid].doubleValue()){  
  142.                       smallpoint=mid+1 ;  
  143.                   }else {  
  144.                       bigpoint=mid-1 ;  
  145.                   }  
  146.               }  
  147.               for ( int  j=i;j>smallpoint;j--){  
  148.                   data[j]=data[j-1 ];  
  149.               }  
  150.               data[bigpoint+1 ]=tmp;  
  151.           }  
  152.     }  
  153.       
  154.     /**  
  155.      * 插入排序————希爾排序  
  156.      * @param data  
  157.      */   
  158.     public   static    void   希爾排序(Number[] data)  
  159.     {  
  160.         int  span=data.length/ 7 ;  
  161.         if (span== 0 )span= 1 ;  
  162.         while (span>= 1 ){  
  163.             for ( int  i= 0 ;i<span;i++){  
  164.                 for ( int  j=i;j<data.length;j=j+span){  
  165.                     //組內直接插入排序     
  166.                     int  p = j-span;  
  167.                     Number temp = data[j];  
  168.                     while ( p >= 0  && data[p].doubleValue() > temp.doubleValue()){  
  169.                         data[p+span] = data[p];  
  170.                         p -=span;  
  171.                     }     
  172.                     data[p + span] = temp;  
  173.                 }  
  174.             }  
  175.             span=span/2 ;  
  176.         }  
  177.           
  178.         
  179.     }  
  180.       
  181.     /**  
  182.      * 交換排序————冒泡排序  
  183.      *   
  184.      * @param data  
  185.      */   
  186.     public   static   void   冒泡排序(Number[] data)  
  187.     {  
  188.          for  ( int  i =  0 ; i < data.length; i++) {  
  189.              //將相鄰兩個數進行比較,較大的數往後冒泡   
  190.              for  ( int  j =  0 ; j < data.length - i- 1 ; j++) {  
  191.                     if  (data[j].doubleValue()> data[j +  1 ].doubleValue()) {  
  192.                            //交換相鄰兩個數   
  193.                            
發佈了62 篇原創文章 · 獲贊 2 · 訪問量 6002
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章