好吧 就是为了自我督促一下 总结一下
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了