Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2116704
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-07-22 15:48:55

1.1直接插入排序
类似于扑克牌,假设前面的数据都是己排好序的,当下一个数据到来时,
先扫描要插入的位置,然后把数据插入。
1.2 代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)

  4. int dump_arry(int* arr, int len)
  5. {
  6.     int i;
  7.     for(i=0; i<len; i++)
  8.     {
  9.         //printf("%d=%d ", i, arr[i]);
  10.         printf("%d ", arr[i]);
  11.     }
  12.     printf("\n");
  13.     return 0;
  14. }
  15. //b.1顺序是不对的,先找到要插入的位置
  16. int get_insert_position(int* arr, int end_pos, int key)
  17. {
  18.     int i;                  //end_pos当前要插入数据的位置
  19.     int start_pos;          //start_pos数据要插入的位置
  20.     //printf("end_pos=%d\n",end_pos);
  21.     for(i=end_pos; i>=0; i--)
  22.     {
  23.         if(arr[i]<key)
  24.             break;
  25.     }

  26.     start_pos = i+1;
  27.     if(i<0)
  28.         start_pos = 0;
  29.     return start_pos;
  30. }
  31. //b.2顺序是不对的,把数据插入到这个位置处
  32. int insert_to_position(int* arr, int start_pos, int end_pos, int key)
  33. {
  34.     int i//start_pos数据要插入的位置,end_pos当前要插入数据的位置
  35.     for(i=end_pos; i>start_pos; i--)
  36.     {
  37.         arr[i] = arr[i-1];
  38.     }
  39.     arr[start_pos] = key;
  40.     return 0;
  41. }

  42. //按从小到大进行插入排序
  43. int insert_sort(int* arr, int len)
  44. {
  45.     int i;
  46.     int key;
  47.     int pos;
  48.     for(i=1; i<len; i++)
  49.     {
  50.         dump_arry(arr, len);
  51.         if(arr[i] >= arr[i-1])                  //a.顺序是对的,直接跳过
  52.             continue;
  53.         key = arr[i];
  54.         pos = get_insert_position(arr, i-1, key);   //b.1顺序是不对的,先找到要插入的位置
  55.         insert_to_position(arr, pos, i, key);       //b.2顺序是不对的,把数据插入到这个位置处
  56.     }
  57.     return 0;
  58. }

  59. int main ( int argc, char *argv[] )
  60. {
  61.     //int arr[] = {49, 38, 65, 97, 76, 13, 27, 49};
  62.     //int arr[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
  63.     int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
  64.     int len = sizeof(arr)/sizeof(int);
  65.     dbmsg("len=%d", len);
  66.     insert_sort(arr, len);  //按从小到大进行插入排序
  67.     dump_arry(arr, len);
  68.     return EXIT_SUCCESS;
  69. }
1.3 运行结果
49  38  65  97  76  13  27  49     -->原始数据 
38  49  65  97  76  13  27  49     -->插入38后,38<49,只需将38与49交换即可
38  49  65  97  76  13  27  49     -->插入65后,不需要移动数据
38  49  65  97  76  13  27  49     -->插入97后  
38  49  65  76  97  13  27  49     -->插入76后,76<97,只需将76与97交换即可  
13  38  49  65  76  97  27  49     -->插入13后,插入13移动的数据比较多  
13  27  38  49  65  76  97  49     -->插入27后 
13  27  38  49  49  65  76  97     -->插入49后
1.4 性能分析
O(n2) 
阅读(1026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~