插入排序
插入排序,一般也被稱爲直接插入排序。對於少量元素的排序,它是一個有效的算法 。插入排序是一種最簡單的排序方法,它的基本思想是將一個記錄插入到已經排好序的有序表中,從而一個新的、記錄數增1的有序表。在其實現過程使用雙層循環,外層循環對除了第一個元素之外的所有元素,內層循環對當前元素前面有序表進行待插入位置查找,並進行移動
基本思想
插入排序的工作方式像許多人排序一手撲克牌。開始時,我們的左手爲空並且桌子上的牌面向下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的位置。爲了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較。拿在左手上的牌總是排序好的,原來這些牌是桌子上牌堆中頂部的牌 。
插入排序是指在待排序的元素中,假設前面n-1(其中n>=2)個數已經是排好順序的,現將第n個數插到前面已經排好的序列中,然後找到合適自己的位置,使得插入第n個數的這個序列也是排好順序的。按照此法對所有元素進行插入,直到整個序列排爲有序的過程,稱爲插入排序 。
先上代碼
//插入排序
public static void insertSort(int[] arr) {
int insertVal = 0;
int insertIndex = 0;
for(int i = 1; i < arr.length; i++) {
//定義待插入的數
insertVal = arr[i];
insertIndex = i - 1; // 即arr[1]的前面這個數的下標
// 給insertVal 找到插入的位置
// 1. insertIndex >= 0 保證在給insertVal 找插入位置,不越界
// 2. insertVal < arr[insertIndex] 待插入的數,還沒有找到插入位置
// 3. 就需要將 arr[insertIndex] 後移
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
insertIndex--;
}
//這裏我們判斷是否需要賦值
if(insertIndex + 1 != i) {
arr[insertIndex + 1] = insertVal;
}
}
}
圖解
假設我們有一個數組6位{39, 34, 116, 7, -9, 89}
第一趟進行排序
1.insertVal = arr[i];
insertIndex = i - 1;
2.進入while循環判斷符合條件
3.if循環判斷符合條件賦值
第一趟循環結果[34, 39, 116, 7, -9, 89]
第二趟進行排序
不符合while循環和if循環直接進入第三次循環
第二次循環結果[34, 39, 116, 7, -9, 89]
第三趟進行排序
1 insertindex指向下標爲2的數組元素, insertVal = arr[3]=7;
2
進入while 循環
下標爲3的數組元素等於下標爲2的數組元素
然後insertindex-1前移
3繼續進入while 循環
下標爲2的數組元素等於下標爲1的數組元素
然後insertindex-1前移
4 下標爲1的數組元素等於下標爲0的數組元素
然後insertindex-1前移
5 進入if判斷 符合條件 將7給下標爲0 的數組元素
第四次,第五次循環原理都是如此。
第三次循環結果[7, 34, 39, 116, -9, 89]
第四次循環結果[-9, 7, 34, 39, 116, 89]
第五次循環結果[-9, 7, 34, 39, 89, 116]
循環結束