近幾天再重新看數據結構的書時,根據各種排序的空間復雜度,發現快速排序所用時間是最短的,也即是說快速排序的速度最快。因此想驗證一下具體這幾個排序發的快慢,所以在Java中得以實現,同時在運行時,發現雖然快速排序的速度很快,但是它所消耗的內存是最大的。這也說明了當我們追求速度時,也必須要付出其他方面的代價。以下是幾種方法的具體實現,及其所消耗的時間。
首先在Java中隨機生成20個1000以內的數,然后使用四種排序法分別進行排序,驗證四種排序程序的無誤,以下是具體結果:
通過以上結果證明四種排序方法均可以達到排序目的,以下是對四種排序法時間的測試,觀看各個測試時間的長短,具體結果如下所示:
以上是對隨機生成的10萬個數進行排序時所需時間,從上顯然可看出冒泡所需時間為27秒,選擇排序為8秒,而插入排序為5秒,冒泡排序時間為0秒。所以冒泡是最慢的而選擇居其次,快速排序是最快的。以下是具體代碼:
1 /** 2 * 作者:曹家銘 3 * 日期:2016,4,7 4 * 功能:演示冒泡,選擇,插入,快速排序的時間快慢程度比較 5 */ 6 package com.Paixu; 7 8 import java.util.Calendar; 9 10 public class Paixu { 11 12 public static void main(String[] args) { 13 // TODO Auto-generated method stub 14 15 int N=100000; 16 int arr[]=new int[N]; 17 for(int i=0;i<N;i++) 18 { 19 int m=(int)(Math.random()*1000); 20 arr[i]=m; 21 } 22 Bubble bubble=new Bubble(); 23 Select select=new Select(); 24 Insert insert=new Insert(); 25 Quick quick=new Quick(); 26 Calendar calendar=Calendar.getInstance();//打印當前系統時間 27 //冒泡排序所用時間 28 System.out.println("冒泡排序前的時間為:"+calendar.getTime()); 29 bubble.sort(arr); 30 calendar=Calendar.getInstance(); 31 System.out.println("冒泡排序后的時間為:"+calendar.getTime());//打印排序后的時間*/ 32 //選擇排序所用時間 33 System.out.println("選擇排序前的時間為:"+calendar.getTime()); 34 select.sort(arr); 35 calendar=Calendar.getInstance(); 36 System.out.println("選擇排序后的時間為:"+calendar.getTime());//打印排序后的時間*/ 37 //插入排序所用時間 38 System.out.println("插入排序前的時間為:"+calendar.getTime()); 39 insert.sort(arr); 40 calendar=Calendar.getInstance(); 41 System.out.println("插入排序后的時間為:"+calendar.getTime());//打印排序后的時間*/ 42 //快速排序所用時間 43 System.out.println("快速排序前的時間為:"+calendar.getTime()); 44 quick.sort(0, arr.length-1, arr); 45 calendar=Calendar.getInstance(); 46 System.out.println("快速排序后的時間為:"+calendar.getTime());//打印排序后的時間 47 //冒泡排序后的結果 48 bubble.sort(arr); 49 System.out.println("冒泡排序之后的數組順序為:"); 50 for(int i=0;i<arr.length;i++) 51 { 52 System.out.print(arr[i]+" "); 53 } 54 System.out.println(); 55 //選擇排序后的結果 56 select.sort(arr); 57 System.out.println("選擇排序之后的數組順序為:"); 58 for(int i=0;i<arr.length;i++) 59 { 60 System.out.print(arr[i]+" "); 61 } 62 System.out.println(); 63 //插入排序的結果 64 insert.sort(arr); 65 System.out.println("插入排序之后的數組順序為:"); 66 for(int i=0;i<arr.length;i++) 67 { 68 System.out.print(arr[i]+" "); 69 } 70 System.out.println(); 71 //快速排序的結果 72 quick.sort(0, arr.length-1, arr); 73 System.out.println("快速排序之后的數組順序為:"); 74 for(int i=0;i<arr.length;i++) 75 { 76 System.out.print(arr[i]+" "); 77 } 78 } 79 80 } 81 //快速排序 82 class Quick{ 83 public void sort(int fist,int last,int arry[]){ 84 int f=fist; 85 int l=last; 86 int mid=arry[(fist+last)/2]; 87 int temp=0; 88 while(f<l){ 89 while(arry[f]<mid) f++; 90 while(arry[l]>mid) l--; 91 if(f>=l) break; 92 temp=arry[f]; 93 arry[f]=arry[l]; 94 arry[l]=temp; 95 if(arry[f]==mid) --l; 96 if(arry[l]==mid) ++f; 97 } 98 if(f==l){ 99 f++; 100 l--; 101 } 102 //利用遞歸快速排序 103 if(fist<l) sort(fist,l,arry); 104 if(last>f) sort(f,last,arry); 105 } 106 } 107 //插入排序 108 class Insert{ 109 public void sort(int arry[]){ 110 for(int i=1;i<arry.length;i++) 111 { 112 int InsertNum=arry[i]; 113 int Index=i-1; 114 while(Index>=0&&InsertNum<arry[Index]) 115 { 116 arry[Index+1]=arry[Index];//將前一個數復制給后一個比他小的數 117 Index--; 118 } 119 arry[Index+1]=InsertNum;//將該插入的數復制給前一個較小的數 120 } 121 } 122 } 123 //冒泡排序 124 class Bubble{ 125 public void sort(int arry[]){ 126 int temp=0; 127 for(int i=0;i<arry.length-1;i++) 128 { 129 for(int j=0;j<arry.length-i-1;j++) 130 { 131 if(arry[j]>arry[j+1]) 132 { 133 temp=arry[j]; 134 arry[j]=arry[j+1]; 135 arry[j+1]=temp; 136 } 137 } 138 } 139 } 140 } 141 //選擇排序 142 class Select{ 143 public void sort(int arry[]){ 144 int temp=0; 145 for(int i=0;i<arry.length-1;i++) 146 { 147 int min=arry[i]; 148 int minIndex=i; 149 for(int j=i+1;j<arry.length-1;j++) 150 { 151 if(min>arry[j]) 152 { 153 min=arry[j]; 154 minIndex=j; 155 } 156 } 157 temp=arry[i]; 158 arry[i]=arry[minIndex]; 159 arry[minIndex]=temp; 160 } 161 } 162 }