Chinaunix首页 | 论坛 | 博客
  • 博客访问: 491639
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1190
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-08 20:16
文章分类

全部博文(144)

文章存档

2017年(1)

2015年(5)

2014年(108)

2013年(30)

我的朋友

分类: C/C++

2013-10-19 11:18:48

直接插入排序:是一种简单的排序方法,它的基本操作时将一个记录插入到已排好的有序表中,从而得到一个新的,记录加一的有序表。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #define MAXSIZE 20
  3. #define N 10
  4. typedef int KeyType;
  5. typedef char InfoType;
  6. typedef struct
  7. {
  8.     KeyType key;
  9.     InfoType otherinfo;
  10. }ReadType;
  11. typedef struct
  12. {
  13.     ReadType r[MAXSIZE+1];
  14.     int length;
  15. }Sqlist;
  16. void InitSq(Sqlist * L);
  17. void InsertSort(Sqlist *L);
  18. void main()
  19. {
  20.     Sqlist Sqlist1;
  21.     int i;
  22.     InitSq( &Sqlist1);
  23.     printf("请输入%d个数字用插入法进行排序\n",N-1);
  24.     for(i=1;i<N;i++)//第i=0位留着作为哨兵
  25.     {
  26.         scanf("%d",&Sqlist1.r[i].key);
  27.         Sqlist1.length++;
  28.     }
  29.     printf("排序前:\n");
  30.         for(i=1;i<N;i++)
  31.     {
  32.         printf("%d",Sqlist1.r[i].key);
  33.     }

  34.     InsertSort(&Sqlist1);

  35.     printf("排序后:\n");
  36.     for(i=1;i<N;i++)
  37.     {
  38.         printf("%d ",Sqlist1.r[i].key);
  39.     }
  40.     system("pause");
  41. }
  42. void InitSq(Sqlist * L)
  43. {
  44.     int i;
  45.     for(i=0;i<=MAXSIZE;i++)
  46.     {
  47.         L->r[i].key=0;
  48.         L->length=0;
  49.         
  50.     }
  51. }
  52. void InsertSort(Sqlist *L)
  53. {
  54.     int i,j,k;
  55.     for(i=2;i<N;i++)
  56.     {
  57.         L->r[0]=L->r[i];//把要插入的数据保存的第一位,作为哨兵
  58.         for(j=i;j>0;j--)
  59.         {
  60.          if(L->r[j-1].key <= L->r[0].key)//从后面往前对比大小
  61.          {
  62.             
  63.             for(k=i;k>j;k--)
  64.             {
  65.                 L->r[k]=L->r[k-1];
  66.             }
  67.             L->r[j]=L->r[0];
  68.             break ;//插入数据后后就退出本次循环
  69.          }
  70.         
  71.         }
  72.     }
  73. }

排序算法改进如下
 

点击(此处)折叠或打开

  1. void InsertSort(Sqlist *L)
  2. {
  3.     int i,j;
  4.     for(i=2;i<=L->length;i++)
  5.     {
  6.         if(L->r[i].key<L->r[i-1].key)
  7.         {
  8.             L->r[0]=L->r[i];
  9.             L->r[i]=L->r[i-1];
  10.             for(j=i-2;L->r[0].key<L->r[j].key;--j)
  11.                 L->r[j+1]=L->r[j];
  12.             L->r[j+1]=L->r[0];
  13.         }
  14.     }
  15. }

阅读(667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~