算法---1.插入排序

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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值