当前位置:   article > 正文

利用二分查找算法在一个有序表中插入一个元素x,并保持表的有序性。_将 x 插入数组中,仍保持数组有序,如何用二分查找法 找到 x 应该插入的位置?试写出

将 x 插入数组中,仍保持数组有序,如何用二分查找法 找到 x 应该插入的位置?试写出

利用二分查找算法在一个有序表中插入一个元素x,
并保持表的有序性。 

CODE:

  1. /*
  2. 利用二分查找算法在一个有序表中插入一个元素x,
  3. 并保持表的有序性。
  4. */
  5. #include <stdio.h>
  6. #define END 1 << 12//4096作为 整形数组的结束标识
  7. int get_len(int a[]);//获取数组长度
  8. void print_array(int a[]);//打印数组
  9. int len = 0;//测试数组的长度
  10. void insert(int a[],int point,int data)
  11. {
  12. if(a[point] > data)//说明 插入值该插入到其前面
  13. {
  14. for(int i = len - 1;i >= point;i --)
  15. {
  16. a[i + 1] = a[i];//向后移动一个 单位 (原point位置的值也向后移动)
  17. }
  18. a[point] = data;//目标值插入到point位置
  19. }
  20. else//如果大于等于其值就 插入到目标点 后面
  21. {
  22. for(int i = len - 1;i > point;i --)
  23. {
  24. a[i + 1] = a[i];//向后移动一个 单位 (原point位置的值也向后移动)
  25. }
  26. a[point + 1] = data;//目标值插入到point位置
  27. }
  28. }
  29. //二分查找 插入位置 并插入
  30. void BinarySearch(int a[],int low,int high,int data)
  31. {
  32. if(low == high)//找到 插入点
  33. {
  34. insert(a,low,data);//参数:数组,插入点,插入数据
  35. return;
  36. }
  37. int mid = (low + high)/2;//获取 中间值
  38. if(a[mid] < data)//mid小于data 递增有序表中说明 得插入在是在mid的右边
  39. {
  40. BinarySearch(a,mid + 1,high,data);
  41. }
  42. else if(a[mid] > data)//mid大于data 递增有序表中说明 得插入在mid的左边
  43. {
  44. BinarySearch(a,low,mid - 1,data);
  45. }
  46. else//如果存在和插入值一样大的数 直接插入
  47. {
  48. insert(a,mid,data);//参数:数组,插入点,插入数据
  49. return;
  50. }
  51. return;
  52. }
  53. int main()
  54. {
  55. int a[101] = {1,2,2,15,16,18,20,20,30,33,END};//test 有序表 END为结束符(默认为0,如果不用0需要自己定义结束符)
  56. len = get_len(a);//获取元素个数
  57. //print打印 原数组
  58. print_array(a);
  59. //输入要插入的值
  60. int data = 0;
  61. scanf("%d",&data);
  62. //二分查找 插入位置 并插入
  63. BinarySearch(a,0,len - 1,data);
  64. a[len + 1] = END;//增加一个 元素 完毕 添上结束符
  65. //print打印 插入后数组 样子
  66. print_array(a);
  67. return 0;
  68. }
  69. //打印数组
  70. void print_array(int a[])
  71. {
  72. int size = get_len(a);//获取 传入数组的元素长度
  73. for(int i = 0;i < size;i ++)
  74. {
  75. printf("%d ",a[i]);
  76. }
  77. printf("\n");
  78. return;
  79. }
  80. //获取数组长度
  81. int get_len(int a[])
  82. {
  83. int i = 0;
  84. while(a[i] != END)
  85. {
  86. i ++;
  87. }
  88. return i;
  89. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/977558
推荐阅读
相关标签
  

闽ICP备14008679号