插入排序會將之前的所有的比它大的元素進行兩兩交換(從小到大排列的排序),會增加一些交換時間,降低運行效率,下面我們來討論一下它的優化算法,
不是進行兩兩交換,而是把當前待插入的元素取出,讓當前元素與之前的所有元素進行一一比較,前一個元素大於當前元素直接覆蓋,而到了最后當找到當
前元素的合適位置時只需要一次交換即可。
如序列: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]+" ");
}
}
}
}
