您的位置:首页 > 其它

插入排序【算法导论】

2013-02-16 14:00 211 查看

算法描述

    插入排序是一种就地,增量排序,不需要额外的存储空间。它主要是针对小数据两的排序。

    核心思想:类似抓扑克牌,右手抓牌向左手持有的牌中插入,每次插入后保证左手持有的扑克牌是有序的。

伪代码    

for j-<2;j<length[A];j++
key=A[j];
i=j-1;
while i>0 and A[i]>key
A[i+1]=A[i];
i--;
A[i+1]=key;

算法证明(循环不变式)

    初始化:在第一次遍历时,子数组A[0..j-1],只有一个元素,它已经是有序的。

    保持:进入子循环时,在子数组A[j-1],A[j-2]....A[0]从后向前查找,若key小于子元素,则当前子元素向前移动一个位置。从而保证了子数组的有序性。

    终止:最后一次循环,j>length[A]时,外层循环结束,子数组[1..n]就是整个数组,已经排好序了,证明了算法正确性。

代码C实现

#include<stdio.h>
#include "insertsort.h"
int insertsort(int *p,int length){
int key=0;
int i = 0;
int j = 0;
if(p == NULL || length < 1){
printf("array is empty or length of array is zero\n");
return 0;
}
for(i = 1;i < length;i++){
key = *(p+i);
j = i - 1;
while(j >= 0 && *(p + j) > key){
*(p+1+j) = *(p+j);
j--;
}
*(p + j + 1) = key;
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: