如何理解插入排序?

叮咚~到账一个亿發表於2024-05-24

演算法原理:相當於抓牌,每次新抓的牌要保證有序,將新抓的牌與前面進行依次比較,如果比前面的小,進行交換。一直保證每次抓的牌,插入後的牌是基本有序。

例子:【3,2,5,4,2,3,3】排序,從小到大排序。

  1. 要確保【0,0】範圍要有序,因為只有一個數字3,所以肯定是有序的,無需交換
    排序前:【】
    新抓的牌【3】 待排序:【2,5,4,2,3,3】
    排序後:【3】
  2. 要確保【0,1】範圍要有序,此時相當於2是新抓的牌,和前面的牌比較(數字比較大小),交換數字2,3
    排序前:【3】
    新抓的牌【2】 待排序:【5,4,2,3,3】
    排序後:【2,3】
  3. 要確保【0,2】範圍要有序,此時新抓的牌是5,和前面的排序的數字牌進行依次比較,即是將5和2,3,5是比3大,不需要移動。5比3大,無需要進行移動。
    排序前:【2,3】
    新抓的牌【5】 待排序:【4,2,3,3】
    排序後:【2,3,5】
  4. 要確保【0,3】範圍要有序,此時新抓的牌是4,和前面的排序的數字牌進行依次比較,即是將4和2,3,5比較。4比5小,交換。後面的無需移動
    排序前:【2,3,5】
    新抓的牌【4】 待排序:【2,3,3】
    插入後:【2,3,5,4】 4比5小 交換
    排序後:【2,3,4,5】 4比後面的都要大,無需要移動
  5. 要確保【0,4】範圍要有序,此時新抓的牌是2,和前面的排序的數字牌進行依次比較,即是將2和2,3,4,5比較。
    排序前:【2,3,4,5】
    新抓的牌【2】 待排序:【3,3】
    插入後:【2,3,4,5,2】 2比5小,交換
    排序後:【2,3,4,2,5】 2比4小,交換
    排序後:【2,3,2,4,5】 2比3小,交換
    排序後:【2,2,3,4,5】無需要交換
  6. 要確保【0,5】範圍要有序,此時新抓的牌是3,和前面的排序的數字牌進行依次比較,即是將3和2,2,3,4,5比較。
    排序前:【2,2,3,4,5】
    新抓的牌【3】 待排序:【3】
    插入後:【2,2,3,4,5,3】 3比5小,交換
    排序後:【2,2,3,4,3,5】 3比4小,交換
    排序後:【2,2,3,3,4,5】 3比3一樣大,無需要交換
  7. 要確保【0,6】範圍要有序,此時新抓的牌是3,和前面的排序的數字牌進行依次比較,即是將3和2,2,3,3,4,5比較。重複6操作
點選檢視程式碼
public static void insertionSort(int [] arr)
{
    if(arr==null||arr.length <2){
        return;
    }
    for(int i = 1;i< arr.length;i++) //做到0-i上有序
    {
        for(int j =i-1;j>=0&&arr[j)>arr[j+1];j--){
        swap(arr,j,j+1);
        }
    }

}

相關文章