插入排序的JavaScript實現
阿新 • • 發佈:2018-09-02
小型 時間復雜度 一輪 冒泡 排序 新的 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實現