//#include <stdio.h> // c 库
#include <stdlib.h> //maclloc 库
#include <iostream> // c++ 库
#include <time.h>
// 有本句 ,下面cout 前面可以没有 std::
using namespace std;
typedef int Elem;
#define MAXSIZE 10
typedef struct {
Elem data[MAXSIZE + 1];
int len;
} SqQueue;
void InitSq(SqQueue& T) {
//随机生成数组
srand((unsigned)time(NULL));
for (int i = MAXSIZE; i > 0; i--)
T.data[i] = rand() % 30;
}
void TravSq(SqQueue T) {
for (int i = 1; i <= MAXSIZE; i++)
cout << T.data[i] << " ";
cout << "\n--------- \n";
}
//插入排序(直接查找插入)
//外层循环指针i从2到 数组[最大],对每个元素进行排序
//内层循环指针j 从i-1 至 1,当前如果比待排序的元素大就后移
//使用哨兵,将待排元素存入数组[0],防止j 越界
void InseSort(SqQueue& T) {
int i, j;
for (i = 2; i <= MAXSIZE; i++)
{
if (T.data[i] < T.data[i - 1]) { //如果待排元素小于前驱则需排序
T.data[0] = T.data[i]; //复制哨兵
for (j = i - 1; T.data[j] > T.data[0]; j--) {
T.data[j + 1] = T.data[j]; //后移
}
T.data[j + 1] = T.data[0]; //插入元素
}
}
}
//插入排序(二分查找插入)
//首先查找位置,然后从后向前移动数据,然后插入
//二分时,mid 若大于待排元素,说明在前面low区域,移动high指针,反之亦然
//二分查找完成low==high+1 ,插入位置为low的位置
void InseBI(SqQueue& T) {
for (int i = 2; i <= MAXSIZE; i++)
{
int x = T.data[i];
int low = 1, high = i - 1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (T.data[mid] > x)
high = mid - 1;
else low = mid + 1;
}
for (int j = i - 1; j >= high; --j)
T.data[j + 1] = T.data[j];
T.data[low] = x;
// cout << " low " << low << " high " << high << " \n";
}
}
void main() {
SqQueue T;
InitSq(T);
TravSq(T);
//InseSort(T);
InseBI(T);
TravSq(T);
}