Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582614
  • 博文数量: 109
  • 博客积分: 1463
  • 博客等级: 上尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-22 13:21
个人简介

希望和广大热爱技术的童鞋一起交流,成长。

文章分类

全部博文(109)

文章存档

2017年(1)

2016年(2)

2015年(18)

2014年(1)

2013年(9)

2012年(15)

2011年(63)

分类: C/C++

2011-08-28 16:36:14

    直接插入排序为稳定排序,基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。时间复杂度为O(n*n),辅助空间为O(1)。
    基本思想:假设在排序过程中,记录序列R[1..n],将记录R[i]插入到有序子序列R[1..i-1]中,使记录的有序序列从R[1..i-1]变为R[1..i]。R[i]的插入过程就是完成排序中的一趟,随着有序序列的不断扩大,最终使全部有序,完成排列。
    算法分析:要将R[i]插入到前面的有序序列中,只要将该记录的关键字与第i-1个记录开始的记录关键字进行比较,当它比前面的数小时,前面的记录顺序后移,否则将该记录存入该单元。在此,还要注意将R[i]临时存储到R[0]中暂存。
 
     哨兵(监视哨)的作用:
1.作为临时变量存放R[i]的副本。
2.在查找循环中用来监视下标变量j是否越界。
 
    算法效率:
时间复杂度最好的情况是已经排好序,比较次数为n-1,移动次数为0;
最坏的情况是反序时进行插入排序,平均的移动次数和比较次数都是O(n*n)。
空间复杂度为O(1)。
 
    排序特点:
1.是一种稳定的排序方法。
2.适用于接近排好序的情况。
3.适用于n较小的情况。
4.直至最后一趟排序过程才能确定一个元素的最终位置。
 
     程序:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #define MAXSIZE 10
  6. typedef struct
  7. {
  8.  int length;
  9.  int arr[MAXSIZE+2];
  10. }list;

  11. void insert(list* p)
  12. {
  13.  int i,j;
  14.  for (i = 2; i <= p->length; i += 1)//第一个暂存,第二个数字是待比较的数字,从第三个开始比较起
  15.   {
  16.    p->arr[0] = p->arr[i];//数组的第一个数字用来暂存每次用来比较的arr[i]

  17.      for (j = i-1; (p->arr[0] < p->arr[j]) && j!=0; j --)
  18.      {
  19.      p->arr[j+1] = p->arr[j];
  20.      }
  21.    p->arr[j+1] = p->arr[0];

  22.   }
  23. }
  24. int main()
  25. {
  26.  int i;
  27.  list *plist;
  28.  plist = (list*)malloc(sizeof(list));//分配空间
  29.  plist->length = MAXSIZE;
  30.  plist->arr[MAXSIZE+2] = 0;//将最后一个数字置为0

  31.  srand((unsigned int)time(NULL));//随机种子生成

  32.  for (i = 1; i < MAXSIZE+1; i += 1)//数组的第一个数字用来暂存每次用来比较的arr[i]
  33.   {
  34.   plist->arr[i] = (rand() % 100);//生成10个100以内的随机数
  35.   printf("array before:%d\n", plist->arr[i]);
  36.   }

  37.  insert(plist);

  38.  printf("\n");

  39.  for (i = 1; i < MAXSIZE+1; i += 1)
  40.   {
  41.   printf("array after:%d\n", plist->arr[i]);
  42.   }
  43.  return 0;
  44. }
    从空间来看,它只需要一个记录的辅助空间R[0];从时间来看,n个记录要进行n-1趟插入过程,每一趟都要进行与关键字的比较和记录的移动,但是比较的次数是不固定的。最好的情况是记录已经是排列有序的,则每一趟都只需要比较一次,就可以找到插入记录的位置,不需移动记录,复杂度为O(n);最坏情况是记录逆序存放,则每一趟都要与前面的关键字进行比较并移动记录,复杂度为O(n*n)。所以平均性能的复杂度为O(n*n)。
    因此,直接插入排序算法非常适合记录基本有序且记录数不是很多的情形。
阅读(3238) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~