標籤:程式設計語言 code 包含 alt 技術分享 直接插入 amp 插入排序 語言
直接插入排序法就像我們打撲克牌時整理牌面一樣,先讓我們腦補一下我們打牌的過程。
首先摸了一張6,
接著摸到一張4,比6小,插到6的前面;
又摸到一張7,比6大,插到6的後面;
又摸到一張5,比6小,比4大,插到4和6中間;
。。。。
以上的過程,其實就是典型的直接插入排序,每次將一個新資料插入到有序隊列中的合適位置裡。
步驟:
1.首先將數組第1個數看成是一個有序序列。
2.將數組的第2個數按照關鍵字大小插入到這個有序序列中,插入後得到了一包含兩個數的有序序列。
3.接下來再重複上面的步驟將第3,第4……第n-1個數分別插入到該有序序列中,最終得到一個包含n個數的有序序列。
很簡單吧,接下來,我們要將這個演算法轉化為程式設計語言。
假設有一組無序序列 R0, R1, ... , RN-1。
(1) 我們先將這個序列中下標為 0 的元素視為元素個數為 1 的有序序列。
(2) 然後,我們要依次把 R1, R2, ... , RN-1 插入到這個有序序列中。所以,我們需要一個外部迴圈,從下標 1 掃描到 N-1 。
(3) 接下來描述插入過程。假設這是要將 Ri 插入到前面有序的序列中。由前面所述,我們可知,插入Ri時,前 i-1 個數肯定已經是有序了。
所以我們需要將Ri 和R0 ~ Ri-1 進行比較,確定要插入的合適位置。這就需要一個內部迴圈,我們一般是從後往前比較,即從下標 i開始向 0 進行掃描。
js代碼實現
let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function insertSort(data) { var temp;//用於儲存需要插入的資料 //注意i從1開始,因為以data[0]為基準數 for(let i=1;i<data.length;i++){ temp=data[i]; //將第i個數儲存,以供之後插入合適位置使用 // 因為前i-1個數都是從小到大的有序序列,只要當前比較的數(data[j-1])比temp大,就把這個數後移一位 for(var j=i;j>=0&&data[j-1]>temp;j--){ //這塊j得用var聲明,因為在for迴圈之外的範圍還要用j data[j]=data[j-1]; } data[j]=temp;//將temp插入合適的位置 } return data; } var sortedData=insertSort(dat); console.log(sortedData);
直接插入排序法原理及其js實現