当前位置:   article > 正文

数据结构实验 折半插入排序_折半查找失败时low指针和high指针为什么要置为mid加减1,而不是直接等于mid

折半查找失败时low指针和high指针为什么要置为mid加减1,而不是直接等于mid


排序方法之----折半插入排序

选择每一个数,然后通过折半查找找到需要插入到的位置.

按照折半插入排序


分析:

折半查找以后,应该插入的位置应该是low,或者high+1 ,因为每次跳出while循环后的low都是在high的右边一位.不能用mid表示,各种情况得到的mid不一样

注意:

这个适用于以下这种形式

  1. while (low <= high)
  2. {
  3. mid = (low + high) / 2;
  4. if (x[i] > x[mid])
  5. low = mid + 1;
  6. else
  7. high = mid - 1;
  8. }






  1. #include <iostream>
  2. #include <cstring>
  3. #include <string>
  4. using namespace std;
  5. /*
  6. * 名称: 二叉排序树的查找
  7. * 方法: 先创建一个BST,然后对其进行查找,插入,删除,
  8. * 专业: 软件工程
  9. * by : mazicwong
  10. */
  11. /* 测试数据
  12. 3 6 9 8 7 5 4 1 2 0
  13. /*
  14. 折半插入排序,即当第i个元素需要插入排序的时候,
  15. 前面的i-1个数都是排序好的,这时候通过折半查找找到需要插入的地方
  16. */
  17. const int maxn = 10;//数组中的数
  18. int main()
  19. {
  20. int x[maxn];
  21. for (int i = 0; i < maxn; i++)
  22. scanf("%d", &x[i]);
  23. for (int i = 1; i < maxn; i++) //把1~maxn-1的数都插入到最前面的序列
  24. {
  25. int low = 0;
  26. int high = i - 1;
  27. int mid;
  28. while (low <= high) //查找完以后,要插入的位置在high+1那里
  29. {
  30. mid = (low + high) / 2;
  31. if (x[i] > x[mid])
  32. low = mid + 1;
  33. else
  34. high = mid - 1;
  35. }
  36. //查找完以后,应该插入的位置在low或者high+1那里,因为退出查询时候low一定在high右边一位
  37. //所以,从0~low-1不变 , 从low到i-1往后移动
  38. int key = x[i];
  39. for (int j = i-1; j >= low; j--)
  40. x[j+1] = x[j];
  41. x[low] = key;
  42. }
  43. for (int i = 0; i < maxn; i++)
  44. printf("%d ", x[i]);
  45. return 0;
  46. }






声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号