1. 程式人生 > >【算法導論】插入排序

【算法導論】插入排序

-- class bsp png 根據 void inf div 如果

沒辦法就是這麽沒原則,又開了個坑。每天看點書,不管什麽書。

1. 需求:

  輸入:n個數的一個序列(a1, a2, a3……an)

  輸出: 輸出序列的一個排列(a1‘, a2‘, a3‘ ……an‘),滿足a1‘ <= a2‘ <= a3‘ ……<= an‘

2. 圖示:

  技術分享圖片

3. 偽代碼

INSERTION-SORT(A)

for j=2 to A.length
    key = A[j]
    i = j-1
    //把A[j]插入到有序數組 A[1...j-1].
while i > 0 and A[i] > key A[i+1] = A[i] i = i -1 A[i + 1] = key

4. 理解

  算法導論不愧是本好書啊,看這偽代碼的註釋多精髓,

  把 A[j] 插入到有序數組 A[1...j-1]

  j是從2開始的,也就是說我們第一次就是做兩個數的排序,這樣就是比較A1 和 A2.,這個就容易了。這樣得到A的前兩個數A1 A2就是有序的

  當J = 3的時候,我們要做的就是在 * A1 * A2 * 三個星號中找到A3的位置(因為A1 <= A2 已經確定了),根據就近原則,我們先用A3跟A2比,如果比A3 比 A2小,就再跟A1比(如果A3比A2大,那肯定就比A1大了),在跟,然後得到一個新的有序序列A1 A2 A3

  當J = 4的時候 我們要做的就是在 * A1 * A2 * A3 * 四個個星號中找到A4的位置(因為A1 <= A2 <= A3 已經確定了),根據就近原則,先跟A3比,然後A2, A1, 然後得到一個新的有序序列A1 A2 A3 A4

  以此類推

5.代碼。因為偽代碼的數組下標是從1開始的,所以一些範圍判定要改一下

java  

//java
void insertionSort(int[] A) {
        for(int j = 1, len =A.length; j < len; j++) {
            
int key = A[j]; int i = j-1; while(i > -1 && A[i] > key) { A[i+1] = A[i]; i = i-1; } A[i+1] = key; } return A; } // input: 5 4 2 9 4 12 6 8 1 3 35 // output: 1 2 3 4 4 5 6 8 9 12 35

C

void insertion_sort(int arr[], int len)
{    
    int i, j, key;
    
    for(i = 1; i< len; i++)
    {
        key = arr[i];
        
        j = i - 1;
        
        while(j > -1 && arr[j] > key)
        {
            arr[j+1] = arr[j];
            
            j--;
         }
         
         arr[j+1] = key;
    }
 } 

python

def insertion_sort(arr):
    le = len(arr)
    for i in range(1, le):
        key = arr[i]
        j = i - 1

        while j > -1 and arr[j] > key:
            arr[j+1] = arr[j]
            j -= 1

        arr[j+1] = key

  

【算法導論】插入排序