第二章 算法入門 - 插入排序

2.1 插入排序

  1. 輸入:無序數組A
  2. 輸出:有序數組A
  3. 基本思想:認爲一個數據是有序的,而後把第二個開始的全部元素依次插入到有序數組中。 數組A有n個元素,索引爲1....n
  4. 僞代碼:InsertSort(A)
for j = 2 to length(A)          //外層循環從第二個元素開始,由於第一個元素認爲是有序的

    do key = A[j]

          // Insert A[j] into  the sorted sequence A[1..j-1]

          i = j - 1;               //內層循環的索引從j-1開始

          while( i > 0 and A[i] > key)  //找到第一個小於等於key的索引

              do A[i+1] = A[i]   //對於大於key的作後移處理

                     i = i -1

          A[i+1] = key // 將key插入到第一個索引後
  1. C語言實現:
void InsertSort(int* a, int len) {

  int i, j, key;

  for(j = 1; j < len; ++j) {

    key = a[j];

    i = j - 1;

    while(i >=0 && a[i] > key) {

      a[i+1] = a[j];

    }

    a[i+1] = key;

}```

# 循環不變式:
- 初始化:在第一輪迭代開始前是正確的
- 保持:若是循環的某一次迭代前它是正確的,那麼下次迭代前它也應該保持正確
- 終止:循環結束

# 習題:
## 2.1-1
31 41 59 26 41 58 // src
31 **41** 59 26 41 58 // 1
31 41 **59** 26 41 58 // 2
26 31 41 59 41 58 // 3
26 31 41 41 59 58 // 4
26 31 41 41 58 59 // 5

## 2.1-2 升序(C語言)

void InsertSort(int *a, int len) { int i, j, key; for(i = 1; i < len; ++i) { key = a[i]; j = i - 1; while(j >=0 && a[j] < key) { a[j+1] = a[j]; j = j -1; } a[j+1] = key; } }數組

相關文章
相關標籤/搜索