排序之直接插入排序(初体验)

来源:互联网 发布:什么是移动云计算 编辑:程序博客网 时间:2024/05/23 01:20

直接插入排序的基本思想:把待排序数列分成有序区和无序区,初始时有序区为待排序数列的第一个元素,其余部分作为待排序元素。然后,将待排序元素一次一个地加入有序区,直到结束。这样来形成新的有序数列。

/*烟台大学计算机学院作者:景怡乐完成时间:2017年6月5日*/#include <stdio.h>#include <stdlib.h>int main(){    int i,j;    int a[10];    for(i=0; i<10; i++)    {        scanf("%d",&a[i]);    }    for(i=1; i<10; i++)    {        int t;        t=a[i];//设置哨兵        for(j=i-1; a[j]>t&&j>=0; j--)//寻找插入位置            a[j+1]=a[j];//前一个大于当前,当前等于前一个        a[j+1]=t;    }    for(i=0; i<10; i++)        printf("%d\n",a[i]);    return 0;}

初始值                12 15 9 20 6 31 24

第一趟排序结果 12 15 9 20 6 31 24

第二趟排序结果 9 12 15 20 6 31 24

第三趟排序结果 9 12 15 20 6 31 24

第四趟排序结果 6 9 12 15 20 31 24

第五趟排序结果 6 9 12 1 5 20 31 24

第六趟排序结果 6 9 12 15 20 24 31

 

由上面的代码和实例来看一个具体的过程。例如在第一趟排序完成,开始第二趟排序:此时i=2.设置哨兵 t=r[i];有内循环的for语句,此时j=1且满足条件t<r[j]所以接着执行r[j+1]=r[j];注意此时数列变为 12 12 15 20 6 31 24 再执行j--此时j=0不再满足内循环for语句的t<r[j]于是退出for执行r[j+1]=r[0]即r[0+1]=r[0].到此数列变为9 12 15 20 6 31 24。

 

在这个程序中一定要注意和明白哨兵的作用——1、它暂存r[i]的值,使之在数列元素移动过程中丢失2、防止查询越界



原创粉丝点击