插入排序的優化算法


插入排序會將之前的所有的比它大的元素進行兩兩交換(從小到大排列的排序),會增加一些交換時間,降低運行效率,下面我們來討論一下它的優化算法,

不是進行兩兩交換,而是把當前待插入的元素取出,讓當前元素與之前的所有元素進行一一比較,前一個元素大於當前元素直接覆蓋,而到了最后當找到當

前元素的合適位置時只需要一次交換即可。

如序列: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]+" ");
			}
			
		}
	}

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM