插入排序-算法导论笔记

  • 插入排序对于少量的数据它是一个有效的算法。插入排序的工作方式像人手里的扑克牌一样。开始时我们手里为空并且桌子上的牌面向下。然后我们每次从桌上拿走一张牌并将它插入手里正确的位置。为了把这种牌插入正确的位置,我们要从右到左将它和已在手中的牌进行比较。如下图:
    这里写图片描述

  • 伪代码:

INSERTION-SORT(A) { 
for j = 2 to A.length { 
key = A[j]; 
//Insert A[j] into the sorted sequence A[1...j-1]
i = j - 1; 
while i > 0 and A[i] > key { 
A[i+1] = A[i]; 
i = i - 1; 
} 
A[i+1] = key; 
} 
}
  • 我们声明一个数组 a = {5,2,4,6,1,3},下标j指正拿到的牌”当前牌”。在for循环的每次迭代的开始,包含元素a[1…j-1]的子数组构成当前已排序好的牌,剩余子数组a[j+1…n]对应于仍在桌上的牌堆。事实上,元素a[1…j-1]就是在原来的位置1到j-1的元素;再把过程用图表示一下。
    这里写图片描述

  • c语言代码实现:
    InsertSort.c

#include <stdio.h>
void insertSort(int *a);
int main() {
    int a[6] = { 5,2,4,6,1,3 };
    insertSort(a);
    int k;
    for (k = 0; k < 6;k++) {
        printf("%d ", a[k]);
    }
    getchar();
    return 0;
}


void insertSort(int *a) {
    int i, j,key;
    //这里是从第二个元素开始的
    for (j = 1; j < 6; j++) {
        key = a[j];
        //上一个元素
        i = j - 1;

        //数组下标0开始所以>=0
        while (i >= 0 && a[i] > key){
            a[i + 1] = a[i];
            i = i - 1;
        }

        a[i + 1] = key;
    }
}
  • 需要注意的是和伪代码有点不一样,伪代码只是实现思想for (j = 1; j < 6; j++)这里是从数组第二个元素开始的,数组从0开始,所以是j = 1;while (i >= 0 && a[i] > key)这里也是因为数组是0开始的,所以是>=0。

posted on 2018-07-08 19:24  愤怒的苹果ext  阅读(27)  评论(0编辑  收藏  举报

导航