-
實現思路:
1.從數組的第二個數據開始往前比較,即一開始用第二個數和他前面的一個比較,如果 符合條件(比前面的大或者小,自定義),則讓他們交換位置。
2.然后再用第三個數和第二個比較,符合則交換,但是此處還得繼續往前比較,比如有 5個數
8,15,20,45, 17
,17比45小,需要交換,但是17也比20小,也要交換,當不需 要和15交換以后,說明也不需要和15前面的數據比較了,肯定不需要交換,因為前 面的數據都是有序的。3.重復步驟二,一直到數據全都排完。
-
動圖演示:
-
代碼實現:
package 排序; import java.text.SimpleDateFormat; import java.util.Date; public class InsertSort { //輸出排序前后的時間,看看大概需要花多久 public static void main(String[] args){ SimpleDateFormat startTime = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); System.out.println("排序開始時間:"+startTime.format(new Date())); sort(); SimpleDateFormat endTime = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); System.out.println("排序結束時間:"+endTime.format(new Date())); } public static void sort(){ //測試80萬個數據的排序 int[] arr = new int[800000]; for (int index = 0; index < 800000; index++) { arr[index] = (int)(Math.random() * 80000); } for (int i = 1; i < arr.length; i++) { int j = i; while (j > 0){ if (arr[j] < arr[j-1]){ int temp ; temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; //System.out.println(Arrays.toString(arr)); j--; }else { break; } } } //System.out.println(Arrays.toString(arr)); } }
-
測試結果:
-
80萬個數據總共耗時:2分零8秒。結果出乎意料。然而在開始寫這個文章之前我已經開始了測試冒泡排序和選擇排序,同樣也是80萬個數據,,,,然鵝,快10分鍾了,還沒結束。。。。估計是沒戲了。
-
性能分析:
1.屬於穩定的排序,適合於數據量小,部分數據有序的情況排序。
2.如果目標是把n個元素的序列升序排列,那么采用插入排序存在最好情況和最壞情況。最好情況就是,序列已經是升序排列了,在這種情況下,需要進行的比較操作需(n-1)次即可。最壞情況就是,序列是降序排列,那么此時需要進行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數加上 (n-1)次。平均來說插入排序算法的時間復雜度為O(n^2)。因而,插入排序不適合對於數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小於千,那么插入排序還是一個不錯的選擇
-
最后:
在這個文章快寫完的時候,剛剛說的冒泡排序測試結果出來了,給大家看看,結果經供參考,由於測試的方法存在科學性和嚴謹性,不一定真的代表這個算法的實際性能,有不足或錯誤之處,歡迎留言指正,謝謝~~~~
花了21分23秒????看來我的冒泡算法有待優化~~~~各位大神如果有比較好的優化方案,歡迎留言指教。謝謝!
下面是我測試冒泡算法的代碼:
package 排序; import java.text.SimpleDateFormat; import java.util.Date; public class BubbleSort { public static void main(String[] args){ // int[] arr={1,3,5,8,45,74}; SimpleDateFormat time = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); System.out.println(time.format(new Date())); int[] arr = new int[800000]; for (int index = 0; index < 800000; index++) { arr[index] = (int)(Math.random() * 80000); } int temp = 0; boolean flag = true; for (int i = 0;i < arr.length-1;i++ ){ for (int j = 0; j < arr.length-1-i ; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; flag = false; } } if (flag){ break; }else { flag = true; } } // System.out.println(Arrays.toString(arr)); SimpleDateFormat time2 = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); System.out.println(time2.format(new Date())); } }