本篇文章針對現有經常使用的排序算法進行比較,並計算出排序所用的時間。java
待排序的個數:100000算法
待排序數值的範圍:0~1000數組
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 }
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 }
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 }
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 }
以上只對四種排序方法進行比較,後期將持續更新。dom
簡化版桶排序主要針對數值範圍小、待排序個數多的數進行排序,由於數值範圍直接影響它要設置多少個桶。函數
冒泡排序只是一種思想,在實際應用中不會應用,由於無論何種狀況,效率太慢!優化
快速排序是一個值得推薦的排序方法。ui
堆排序法是從最小堆(徹底二叉樹)中擴展出來的,排序過程也是很是快速(也能夠用最大堆進行排序,能夠避免創建堆的過程,可能會更優化)。spa