算法---1.插入排序

佐手、 提交于 2019-12-04 19:03:42
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) 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!