排序方法之----折半插入排序
选择每一个数,然后通过折半查找找到需要插入到的位置.
按照折半插入排序
分析:
折半查找以后,应该插入的位置应该是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;
}