插入排序
排序原理:
是通過構建有序序列,對於未排序的數據,在已排序序列中從後向前掃描,找到相應的位置並插入.插入排序在實現上,再從後往前掃描過程中,需要反覆把已排元素逐步向後挪位,爲最新元素提供插入空間.
過程分析:
-
首先我們選定一個索引,假設其左邊元素是有序的,用索引上元素和它左邊的元素從右往左比較.
-
如果左邊的元素大於取出的元素,那麼將這個元素右移一位,此時2已經比到最左邊停止比較,將2 空位上,再將空位索引右移.
-
經過上步得到下面的結果,這時空位左邊兩個元素已經有序了,再將空位元素取出,向左比較.遇到大的將其右移一位,遇到小的停止比較,將6放在空位上.
-
經過上一步得到結果如下.
-
這時空位上取出元素爲5,依次和左邊元素比較.直至遇到小於5的數,或者到了最左邊.
-
經過上面處理,已經有5個元素有序.
代碼實現:
public class Test3 {
public static void main(String[] args) {
int [] arr = {9,2,6,7,5,8,4,1};
//外層向右的index,即作爲比較對象的數據的index
for(int i = 1; i<arr.length; i++){
//用作比較的數據
int temp = arr[i];
int j = i-1;
//當比到最左邊或者遇到比temp小的數據時,結束循環
while(j>=0 && arr[j]>temp){
arr[j+1] = arr[j];
j--;
}
//把temp放到空位上
arr[j+1] = temp;
//打印每次內層循環完結果
System.out.println(Arrays.toString(arr));
}
System.out.println(Arrays.toString(arr));
}
}
結果:
[2, 9, 6, 7, 5, 8, 4, 1]
[2, 6, 9, 7, 5, 8, 4, 1]
[2, 6, 7, 9, 5, 8, 4, 1]
[2, 5, 6, 7, 9, 8, 4, 1]
[2, 5, 6, 7, 8, 9, 4, 1]
[2, 4, 5, 6, 7, 8, 9, 1]
[1, 2, 4, 5, 6, 7, 8, 9]
[1, 2, 4, 5, 6, 7, 8, 9]
小結:
選取一個索引A,假設其左邊元素是有序的,將其拿出來,這時數組就會出現一個空位,
我們將取出來的元素與他左邊元素從右往左比較,遇到比它大的,那麼將這個元素右移一位,
如此下去,直到取出的元素遇到比它小或者比到了最左端,即停止,再將取出元素放回當前空位(即符合它的插入位置),
同時A索引右移一位.這樣一輪下來,索引左邊的元素就是有序的按照這種思想下去就可以完成排序.