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

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; } }数组

相关文章
相关标签/搜索