Java常見經典算法詳解-插入排序(Insertion Sort)

插入排序(Insertion Sort)算法簡介:

插入排序是一種叢序列左端開始依次對數據進行排序的算法。在排序過程中,左側的數據陸續歸位,而右側留下的就是還未被排序的數據。

插入排序(Insertion Sort)算法原理:

插人排序的思路就是從右側的未排序區域內取出一個數據,然後將它插入到已排序區域內合適的位置上。插入排序就類似排紙牌,從牌桌上抓牌排在手裏,手裏的牌始終是有序的,每次都把牌放在相應的位置,這就是插入排序。插入排序步驟如下:

  • 從第一個元素開始,該元素可以認爲已經被排序
  • 取出下一個元素,在已經排序的元素序列中從後向前掃描
  • 如果該元素(已排序)大於新元素,將該元素移到下一位置
  • 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
  • 將新元素插入到該位置後
  • 重複步驟2~5,直到所有元素歸位

舉例說明:

現在需要對數組序列5 3 4 7 2 8 6 9 1 運用插入排序算法從小到大排序。

第一輪:假設最左邊的數字5已經完成排序,所以此時只有5是已歸位的數字。

第二輪:接下來,從待排數字(未排序區域)中取出最左邊的數字3,將它與左邊已歸位的數字進行比較。若左邊的數字更大,就交換這兩個數字。重複該操作,直到左邊已歸位的數字比取出的數字更小,或者取出的數字已經被移到整個序列的最左邊爲止。由於5>3,所以交換這兩個數字位置。

第三輪:此時3和5已歸位,還剩下右邊7個數字未排序。同上述操作,由於4<5,4>3,因此將4插入3與5之間,此時3、4、5均已歸位。

第三輪:重複上述操作直到所有數字都歸位,排序即完成。

插入排序(Insertion Sort)代碼實現:

public class Demo {
 
	public static void main(String[] args) {
		int[] array= {5,3,4,7,2,8,6,9,1};
		int[] newarray=insertionSort(array);
		for(int arr:newarray) {
			System.out.print(arr+" ");
		}
	}
	public static int[] insertionSort(int[] array){
		for(int i=1;i<array.length;i++) {
			for(int j=i;j>0;j--) {
				if(array[j]<array[j-1]) {
					int temp=array[j];
					array[j]=array[j-1];
					array[j-1]=temp;
				}
			}
		}
		return array;
	}
}

插入排序(Insertion Sort)的時間複雜度:

在插入排序中,需要將取出的數據與其左邊的數字進行比較。就跟前面講的步驟一樣,如果左邊的數字更小,就不需要繼續比較,本輪操作到此結束,自然也不需要交換數字的位置。然而,如果取出的數字比左邊已歸位的數字都要小,就必須不停地比較大小,交換數字,直到它到達整個序列的最左邊爲止。具體來說,就是第k輪需要比較k-1次。因此,在最糟糕的情況下,第2輪需要操作1次,第3輪操作2次....第n輪操作n-1次,所以時間複雜度和冒泡排序的一樣,都爲O(n²)。和前面講的排序算法一樣,輸入數據按從大到小的順序排列時就是最糟糕的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章