您的位置:首页 > 其它

直接插入排序

2008-02-29 10:39 169 查看
直接插入排序是一种最简单的排序方法,它的基本思想是依次将每个记录插入到一个有序中去。就是说,第i(i>=1)遍整理时,A1,A2,...,Ai-1已经是排好序的子序列;取出第i个元素Ai,在已排好序的子序列为Ai找到一个合适的位置,并将它插到该位置上。易知上述排序当i=1时实际上为空操作,故可直接从i=2开始。
为了便于控制循环结束,引入元素A[0],行时可以节省时间,
直接插入排序的算法如下:

void strainsert(r,n)
int n,r; 结构类型
{
int i,j;
//外层循环标识并决定待比较的数值。
for(i=2;i<n;i++) //这里的i=2表示的是第2个元素
{
r[0]=r[i]; //待比较元素
j=i-1; //比较元素的前一项
//内层循环为待比较数值确定其最终位置
while( r[0].key < r[j].key ) //比较相邻的前项,如果满足条件,同时在和前项比较
{
r[j+1]=r[j]; //把前面大的项往前移一位
j=j-1;
}
r[j+1]=r[0];
}
}

初始序列:
i=1 [46] 58 15 45 90 18 10 62

i=2 [46 58] 15 45 90 18 10 62
┌——┘

i=3 [15 46 58] 45 90 18 10 62
┌——┘

i=4 [15 45 46 58] 90 18 10 62

i=5 [15 45 46 58 90] 18 10 62
┌—————┘

i=6 [15 18 45 46 58 90] 10 62
┌————————┘

i=7 [10 15 18 45 46 58 90] 62
┌—┘

i=8 [10 15 18 45 46 58 62 90]

算法中引进附加记录A[0]有两个作用:其一是进入查找循环之前,它保存了A[ i ]的值,使得不致于因记录的后移而丢失A[ i ]中的内容;其二是在While循环"监视"下变量j是否越界,一旦越界(即j<1),A[0]自动控制While循环的结束,从而避免了在While循环中每一次都要检测j是否越界(即省略了循环条件"j>=1")。因此我们把称为"监视哨",这种技巧,使得测试循环条件的时间大约减少一半,对于记录数较大的文件,节约的时间相当可观。希望读者能掌握这种技巧。
由此可见,直接插入排序算法简洁,易理解,容易实现。当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法。但是,通常待排记录的数量n很大,此时直接插入排序就不适用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: