赞
踩
排序方法之----折半插入排序
选择每一个数,然后通过折半查找找到需要插入到的位置.
按照折半插入排序
分析:
折半查找以后,应该插入的位置应该是low,或者high+1 ,因为每次跳出while循环后的low都是在high的右边一位.不能用mid表示,各种情况得到的mid不一样
注意:
这个适用于以下这种形式
- while (low <= high)
- {
- mid = (low + high) / 2;
- if (x[i] > x[mid])
- low = mid + 1;
- else
- high = mid - 1;
- }
- #include <iostream>
- #include <cstring>
- #include <string>
- using namespace std;
- /*
- * 名称: 二叉排序树的查找
- * 方法: 先创建一个BST,然后对其进行查找,插入,删除,
- * 专业: 软件工程
- * by : mazicwong
- */
- /* 测试数据
- 3 6 9 8 7 5 4 1 2 0
- /*
- 折半插入排序,即当第i个元素需要插入排序的时候,
- 前面的i-1个数都是排序好的,这时候通过折半查找找到需要插入的地方
- */
-
- const int maxn = 10;//数组中的数
- int main()
- {
- int x[maxn];
- for (int i = 0; i < maxn; i++)
- scanf("%d", &x[i]);
- for (int i = 1; i < maxn; i++) //把1~maxn-1的数都插入到最前面的序列
- {
- int low = 0;
- int high = i - 1;
- int mid;
- while (low <= high) //查找完以后,要插入的位置在high+1那里
- {
- mid = (low + high) / 2;
- if (x[i] > x[mid])
- low = mid + 1;
- else
- high = mid - 1;
- }
- //查找完以后,应该插入的位置在low或者high+1那里,因为退出查询时候low一定在high右边一位
- //所以,从0~low-1不变 , 从low到i-1往后移动
- int key = x[i];
- for (int j = i-1; j >= low; j--)
- x[j+1] = x[j];
- x[low] = key;
- }
- for (int i = 0; i < maxn; i++)
- printf("%d ", x[i]);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。