插入排序會將之前的所有的比它大的元素進行兩兩交換(從小到大排列的排序),會增加一些交換時間,降低運行效率,下面我們來討論一下它的優化算法,
不是進行兩兩交換,而是把當前待插入的元素取出,讓當前元素與之前的所有元素進行一一比較,前一個元素大於當前元素直接覆蓋,而到了最后當找到當
前元素的合適位置時只需要一次交換即可。
如序列:3 5 2 1 4
元素5先存入臨時變量temp中,跟前面元素比較,比前面元素大,然后拿出下一個元素2存入臨時變量temp中,2與前一個元素5比較,2比5小,用5直接覆蓋2
結果序列為:3 5 5 1 4 temp=2,然后temp再與前一個元素3進行比較,發現2比3小,然后3再覆蓋剛才的位置,序列為3 3 5 1 4這時發現已經到序列的頭部了,
然后將temp=2復制給arr[0],就是直接覆蓋第一個元素3,序列變為2 3 5 1 4,第一輪排序結束,跟直接插入排序太大的區別,只不過是減少了不斷交換的次數
用直接復制覆蓋取代,這樣當數據量特別大時效率就會提高很多。
代碼實現:
package Sort; import java.util.Scanner; public class InsertSort2 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt(); //輸入 int[] arr=new int[n]; for(int i=0;i<n;i++) { arr[i]=scan.nextInt(); } //排序 for(int i=1;i<arr.length;i++) {//從第2個元素開始遍歷 int temp=arr[i];//將當前位置的元素取出 int j; for(j=i;j>0;j--) { if(temp<arr[j-1]) {//如果這個元素比temp大就覆蓋,否則就證明該元素之前已經有序就break arr[j]=arr[j-1];//直接用前一個元素進行覆蓋 } else { break; } } //將temp中的元素插入合適位置 arr[j]=temp; } //輸出 for(int i=0;i<arr.length;i++) { //判斷是否為最后一個元素 if(i==arr.length-1) { System.out.print(arr[i]); //最后一個元素,不用加空格 }else { System.out.print(arr[i]+" "); } } } }