各類排序算法總結

本篇文章針對現有經常使用的排序算法進行比較,並計算出排序所用的時間。java

待排序的個數:100000算法

待排序數值的範圍:0~1000數組

1  簡化版桶排序法

 1 import java.util.Random;  2 
 3 /*對0~10000之間的100000個數從小到大排序  4  * 簡化桶排序法  5  * 祁俊輝 17.5.2  6  * */
 7 public class Tong {  8     static int a[]=new int[100000];//定義存儲100000個待排序數的數組
 9     static int b[]= new int[100001];//定義桶,範圍0~100000,因此共10001個桶 10     //定義一個簡易桶排序的方法
11     static void BarrelSort(int[] Dai,int[] Tou){//傳入待排序數組、桶數組
12         for(int i=0;i<Dai.length;i++){ 13             Tou[Dai[i]]++; 14  } 15  } 16     //生成隨機數
17     static int RandomMM(int min,int max){ 18         Random random = new Random(); 19         int s = random.nextInt(max)%(max-min+1) + min; 20         return s; 21  } 22     //主方法
23     public static void main(String[] args) { 24         long starTime=System.currentTimeMillis();//當前時間賦給一個變量
25         for(int i=0;i<a.length;i++){ 26             a[i] = RandomMM(0,10000); 27  } 28         BarrelSort(a,b);//桶排序調用 29         //輸出排序後的結果 30         //遍歷桶,爲0的不打印(說明沒出現過),1以上的循環打印(防止同一個數屢次出現)
31         for(int i=0;i<b.length;i++){ 32             for(int j=1;j<=b[i];j++){ 33  System.out.println(i); 34  } 35  } 36         long endTime=System.currentTimeMillis();//當前時間賦給一個變量
37         long time=endTime-starTime;//計算所用時間
38         System.out.println("對100000個「0~10000」範圍的整數排序(冒泡排序法):"+time+"ms");//輸出時間
39  } 40 }

2  冒泡排序法

 1 import java.util.Random;  2 
 3 /*對0~10000之間的100000個數從小到大排序  4  * 冒泡法  5  * 祁俊輝 17.5.2  6  * */
 7 public class Mao {  8     static int a[]=new int[100000];//定義存儲100000個待排序數的數組  9     //定義一個冒泡排序的方法
10     static void BubbleSort(int[] Dai){ 11         for(int i=1;i<Dai.length;i++){//n個數排序,只需進行n-1趟操做(一次操做只將1個數歸位)
12             for(int j=0;j<Dai.length-i;j++){//第一趟比較n-1次,第二趟比較n-2次。。。
13                 if(Dai[j]>Dai[j+1]){//不知足條件,交換
14                     int temp=a[j]; 15                     Dai[j]=Dai[j+1]; 16                     Dai[j+1]=temp; 17  } 18  } 19  } 20  } 21     //生成隨機數
22     static int RandomMM(int min,int max){ 23         Random random = new Random(); 24         int s = random.nextInt(max)%(max-min+1) + min; 25         return s; 26  } 27     //主方法
28     public static void main(String[] args) { 29         long starTime=System.currentTimeMillis();//當前時間賦給一個變量
30         for(int i=0;i<a.length;i++){ 31             a[i] = RandomMM(0,10000); 32  } 33         BubbleSort(a);//冒泡排序調用 34         //輸出排序後的結果
35         for(int i=0;i<a.length;i++){ 36  System.out.println(a[i]); 37  } 38         long endTime=System.currentTimeMillis();//當前時間賦給一個變量
39         long time=endTime-starTime;//計算所用時間
40         System.out.println("對100000個「0~10000」範圍的整數排序(冒泡排序法):"+time+"ms");//輸出時間
41  } 42 }

3  快速排序法

 1 import java.util.Random;  2 
 3 /*對0~10000之間的100000個數從小到大排序  4  * 快速排序法  5  * 祁俊輝 17.5.2  6  * */
 7 public class Kuai {  8     static int a[]=new int[100000];//定義存儲100000個待排序數的數組  9     //定義一個快速排序的方法
10     static void QuickSort(int[] Dai,int left,int right){//傳入待排序數組、左右下標
11         int i,j,t,temp; 12         if(left>right)//若是越界,則表示出錯,直接退出
13             return; 14         temp=Dai[left];//存儲基準數
15         i=left; 16         j=right; 17         while(i!=j){ 18             while(Dai[j]>=temp && i<j)//注意順序,先從右往左,要否則會落下一個數
19                 j--; 20             while(Dai[i]<=temp && i<j)//再從左往右
21                 i++; 22             if(i<j){//沒有相遇,則交換
23                 t=Dai[i]; 24                 Dai[i]=Dai[j]; 25                 Dai[j]=t; 26  } 27  } 28         //運行到這裏,說明左右相遇了,將基準數歸位
29         Dai[left]=Dai[i]; 30         Dai[i]=temp; 31         //左右遞歸運算
32         QuickSort(Dai,left,i-1);//繼續處理左邊的,遞歸
33         QuickSort(Dai,i+1,right);//繼續處理右邊的,遞歸
34  } 35     //生成隨機數
36     static int RandomMM(int min,int max){ 37         Random random = new Random(); 38         int s = random.nextInt(max)%(max-min+1) + min; 39         return s; 40  } 41     //主方法
42     public static void main(String[] args) { 43         long starTime=System.currentTimeMillis();//當前時間賦給一個變量
44         for(int i=0;i<a.length;i++){ 45             a[i] = RandomMM(0,10000); 46  } 47         QuickSort(a,0,a.length-1);//快速排序調用 48         //輸出排序後的結果
49         for(int i=0;i<a.length;i++){ 50  System.out.println(a[i]); 51  } 52         long endTime=System.currentTimeMillis();//當前時間賦給一個變量
53         long time=endTime-starTime;//計算所用時間
54         System.out.println("對100000個「0~10000」範圍的整數排序(快速排序法):"+time+"ms");//輸出時間
55  } 56 }

4  堆排序法(徹底二叉樹)

 1 import java.util.Random;  2 
 3 /*對0~10000之間的100000個數從小到大排序  4  * 堆排序法(堆:徹底二叉樹)  5  * 祁俊輝 17.5.2  6  * */
 7 public class Dui {  8     static int a[]=new int[100001];//定義存儲100000個待排序數的數組,下標從1~100000
 9     static int n=a.length-1;//待排序個數,也就是堆的大小 10     //交換函數,用來交換堆中兩個元素的值
11     static void swap(int[]Dai,int x,int y){ 12         int temp; 13         temp=Dai[x]; 14         Dai[x]=Dai[y]; 15         Dai[y]=temp; 16  } 17     //向下調整函數
18     static void siftdown(int[] Dai,int i){//傳入待排數組和須要向下調整的下標
19         int t,flag=0;//flag用來標記是否須要繼續向下調整 20         //當i結點有兒子(左)而且有須要繼續調整的時候循環執行
21         while(i*2<=n && flag==0){ 22             //首先判斷左邊,並用t記錄值較小的結點編號
23             if(Dai[i] > Dai[i*2]) 24                 t=i*2; 25             else
26                 t=i; 27             //若是它有左邊,在對右邊進行討論
28             if(i*2+1 <= n){ 29                 if(Dai[t] > Dai[i*2+1]) 30                     t=i*2+1; 31  } 32             //若是發現最小的結點編號不是本身,說明子結點中有比父結點更小的
33             if(t!=i){ 34                 swap(Dai,t,i);//交換它們
35                 i=t;//更新i
36             }else{ 37                 flag=1;//不然說明當前父結點已經比它的子節點小,不須要進行調整
38  } 39  } 40  } 41     //創建堆的函數
42     static void creat(int[] Dai){ 43         //從最後一個非頁結點到第一個結點依次進行向下調整
44         for(int i=n/2;i>=1;i--) 45  siftdown(Dai,i); 46  } 47     //刪除最大的元素
48     static int deletemax(int[] Dai){ 49         int t=Dai[1];//用一個臨時變量記錄堆的頂點的值
50         Dai[1]=Dai[n];//將堆的最後一個點賦值到堆頂
51         n--;//堆的元素減1
52         siftdown(Dai,1);//向下調整
53         return t;//返回以前記錄的堆的頂點的最大值
54  } 55     //生成隨機數
56     static int RandomMM(int min,int max){ 57         Random random = new Random(); 58         int s = random.nextInt(max)%(max-min+1) + min; 59         return s; 60  } 61     //主函數
62     public static void main(String[] args) { 63         long starTime=System.currentTimeMillis();//當前時間賦給一個變量
64         for(int i=0;i<a.length;i++){ 65             a[i] = RandomMM(0,10000); 66  } 67         creat(a);//建堆 68         //刪除頂部元素,連續刪除n次,其實就是從小到大把數輸出來
69         for(int i=1;i<=n;i++) 70  System.out.println(deletemax(a)); 71         long endTime=System.currentTimeMillis();//當前時間賦給一個變量
72         long time=endTime-starTime;//計算所用時間
73         System.out.println("對100000個「0~10000」範圍的整數排序(快速排序法):"+time+"ms");//輸出時間
74  } 75 }

5  總結

以上只對四種排序方法進行比較,後期將持續更新。dom

簡化版桶排序主要針對數值範圍小、待排序個數多的數進行排序,由於數值範圍直接影響它要設置多少個桶。函數

冒泡排序只是一種思想,在實際應用中不會應用,由於無論何種狀況,效率太慢!優化

快速排序是一個值得推薦的排序方法。ui

堆排序法是從最小堆(徹底二叉樹)中擴展出來的,排序過程也是很是快速(也能夠用最大堆進行排序,能夠避免創建堆的過程,可能會更優化)。spa

相關文章
相關標籤/搜索