1. 程式人生 > >插入排序的JavaScript實現

插入排序的JavaScript實現

小型 時間復雜度 一輪 冒泡 排序 新的 n-1 等於 %d

思想

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

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

代碼

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");
}

插入排序的JavaScript實現