2.1插入排序(算法导论学习)

好吧 就是为了自我督促一下 总结一下

2.1插入排序

1:算法(非降序)//虽然不知道为啥不叫升序

InsertionSort(A)
for j=2 to A.length
    key=A[j]
    i=j-1
    while(i>0&&A[i]>key)
        A[i+1]=A[i]
        i--
    A[i+1]=key

好了这就是伪代码 付一下自己写的C++的代码 有些麻烦

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

本来打算用下vector啥的迭代器的 发现有些遗忘 于是就用指针啥的了 等看完第二章的算法导论就去复习一下迭代器的知识 写一下再
算法 感觉书上说的蛮清楚的 就好像是在调整手中的扑克牌 首先 当前 A[i]的值就是要插入牌堆的那张 从A[0]到A[i-1]就是按升序排好的牌堆 然后从A[i-1]向A[0]开始与A[i]的值即key比较 布拉布拉
懒得说了 关键在于A[i]的值与A[i]这一位置是要区分开的

2:循环不变式(高中数学 归纳法)

好了 刚开始的时候 感觉没啥用啊 不就是归纳法嘛 一开始 正确 当任意n成立时n+1 推出正确 那么 就ok了

void insertionsort(int*a, int size) {
    int i = size - 2;
    while (i > -1)
    {
        int j = i + 1;
        int key = a[i];
        while (j < size&&a[j]>key)
        {
            a[j - 1] = a[j];
            j++;
        }
        a[j - 1] = key;
        i--;
    }
}

不过 写了我两次第一次就没写对 。。
关键在与理解 归纳法
第一次对 任意一次对 就ok了

猜你喜欢

转载自blog.csdn.net/weixin_39722329/article/details/79301879