插入排序的JavaScript實現

思想

每次在現有已經排好的數組的基礎上排入一個新的數組項。數組

  • 先把第一項看作是已經排好的,第二項應該排在第一項以前仍是以後呢?當前兩項排好後,第三項應該排在這已排好的兩項的以前仍是以後仍是中間呢?當前三項排好後,第四項應該排在這已排好的三項中的什麼位置呢?...以此類推。
  • 在把新的一項排入已排好的數組項中時,將已排好的項從後往前依次與新的一項比較,若是比新的一項大,那麼就依次日後挪一個位置...直到找到小於等於新的一項的數組項的位置,將新的一項排在該位置後面(因爲後面的數組項都日後挪了一個位置,故這裏恰好有一個空位置)便可。

代碼

function insertionSort(arr) {
  const len = arr.length;
  for (let i = 1; i < len; i++) { //在arr[0,...,i-1]中插入arr[i]
    const toInsertValue = arr[i];
    let j;
    for (j = i; j >0 && arr[j-1] > toInsertValue; j--) { //找到一個比arr[i]大的項,就把這個項日後挪一項。由於最後一項就是toInsertValue,因此該值一直能夠經過toInsertValue訪問,故也沒必要另作保存。
      arr[j] = arr[j-1];
    }
    arr[j] = toInsertValue;//內循環結束獲得的arr[j-1]是第一個比arr[i]小的值,那麼就把arr[i]存儲在此處的arr[j]上。而以前的arr[j]已經在上一輪循環中存儲到了arr[j+1]中
    
  }
}

性能分析

  • 時間複雜度:最好O(n),平均、最壞O(n^2) (可是小型數組排序時,其性能要比冒泡和選擇排序好)
  • 空間複雜度: O(1), 穩定

延伸:對比C語音的插入排序

#include<stdio.h>
#include<stdlib.h>
void insertion(int *list,int n)
{
    int i,j,t;
    for(i=1;i<n;i++)//待插入的是list[1]到list[n-1]
    {
        if(list[i]<list[i-1])
        {
            t=list[i];
            list[i]=list[i-1];
            j=i;
            while(t<list[j-1]&&j>=1)
            {
                list[j]=list[j-1];
                j--;
            }
            list[j]=t;  
        }
    
    }
}
main()
{
    int list[10],n=10,i;

    printf("請輸入10個整數:\n");
    for(i=0;i<10;i++)
    {
        scanf("%d",&list[i]);
    }

    insertion(list,10);

    for(i=0;i<10;i++)
    {
        printf("%d\t",list[i]);
    }


    system("pause");
}
相關文章
相關標籤/搜索