#include<iostream>
using namespace std;
#define MIXSIZE 20//顺序表的最大长度;
typedef int keyType;//定义关键字类型为整形
typedef int InfoType;
typedef struct
{
keyType key;//关键字项
InfoType otherinfo;//其他数据项
}RedType;
typedef struct
{
RedType r[MIXSIZE+1];//r[0]闲置或做哨兵单元
int length;//顺序表长度
}SqList;//顺序表类型
/*void InsertSort(SqList& L)
{
for (int i = 2; i <= L.length; i++)
{
if (L.r[i].key < L.r[i - 1].key)//当后一项比前一项小,需将r[i]存入有序字表
{
L.r[0] = L.r[i];//将待插入的记录暂存到监视哨中;
L.r[i] = L.r[i - 1];//r[i-1]整体后移
int j;
for (j = i - 2; L.r[0].key < L.r[j].key; --j)//从后向前寻找插入位置
{
L.r[j + 1] = L.r[j];//记录后移,直到找到插入位置;
}
L.r[j + 1] = L.r[0];//插入到正确位置;
}
}
}*/
void InsertSort(SqList& L)//折半排序
{
int m;
for (int i = 2; i <=L.length; ++i)
{
L.r[0] = L.r[i];//哨兵
int low = 1, high = i - 1;//长度,这个数的前一个数
while (low <= high)//折半查找条件,当high<low就找到位置high+1;
{
m = (low + high) / 2;//折半
if (L.r[0].key < L.r[m].key)//前半区
{
high = m - 1;
}
else//后半区
{
low = m + 1;
}
}
for (int j = i - 1; j >= high + 1; --j)//后移
{
L.r[j + 1] = L.r[j];//后移
}
L.r[high + 1] = L.r[0];//插入
}
}
int main()
{
SqList L;
L.length = 10;
for (int i = 1; i < 10; i++)
{
cin >> L.r[i].key;
}
for (int i = 1; i <= L.length; i++)
{
cout << L.r[i].key<<" ";
}
cout << endl;
InsertSort(L);
cout<<"遍历输出";
for (int i = 1; i <= L.length; i++)
{
cout << L.r[i].key << " ";
}
cout << endl;
return 0;
}
插入排序(C/C++)
最新推荐文章于 2024-06-12 18:28:23 发布