// 直接插入排序、 折半插入排序
#include <iostream>
using namespace std;
template <typename T>
struct RecType //内排序顺序表的记录类型
{
T key; //存放关键字
char data; //存放其他数据,假设为char类型
};
template <typename T>
class MSortClass //内排序类模板
{
RecType<T> R[100]; //存放顺序表中元素
int length; //存放顺序表的长度
public:
MSortClass(); //构造函数,用于顺序表的初始化
void SetK(T a[], int n);
void DispR(); //输出R的所有元素
void InsertSort(); //对R[0..n-1]按递增有序进行直接插入排序
void BinInsertSort(); //对R[0..n-1]按递增有序进行折半插入排序
};
template <typename T>
MSortClass<T>::MSortClass()
{
length = 0;
}
template <typename T>
void MSortClass<T>::SetK(T a[], int n)
{
int i = 0;
for (int i = 0; i < n; i++)
{
R[i].key = a[i];
}
length = n;
}
template <typename T>
void MSortClass<T>::DispR()
{
for (int i = 0; i < length; i++)
cout << R[i].key << "";
cout << endl;
}
template <typename T>
void MSortClass<T>::InsertSort() //对R[0..n-1]按递增有序进行直接插入排序
{
int i, j;
RecType<T> tmp;
for (i = 1; i < length; i++) //直接插入排序是从第2个元素即R[1]开始的
{
if (R[i].key < R[i - 1].key)
{
tmp = R[i]; //取出无序区的第一个元素
j = i - 1; //从右向左在有序区R[0..i-1]中找R[i]的插入位置
/*
do
{
R[j + 1] = R[j]; //将关键字大于tmp.key的元素后移
j--; //继续向前比较
} while (j >= 0 && R[j].key > tmp.key);
R[j + 1] = tmp; //在j+1处插入R[i]
*/
while (j >= 0 && R[j].key > tmp.key)
{
R[j + 1] = R[j];
j--;
}
R[j + 1] = tmp;
}
}
}
template <typename T>
void MSortClass<T>::BinInsertSort() //对R[0..n-1]按递增有序折半插入排序
{
int i,j,low,high,mid;
RecType<T> tmp;
for (i = 1; i < length; i++)
{
if (R[i].key < R[i - 1].key)
{
tmp = R[i]; //将R[i]保存到tmp中
low = 0; high = i - 1;
while (low <= high) //在R[low..high]中折半查找有序插入的位置
{
mid = (low + high) / 2; //取中间位置
if (tmp.key < R[mid].key)
high = mid - 1; //插入点在左半区
else
low = mid + 1; //插入点在右半区
}
for (j = i - 1; j >= high + 1; j--) //元素后移
R[j + 1] = R[j];
R[high + 1] = tmp; //插入原来的R[i]
}
}
}
int main()
{
int array[] = { 2,5,7,3,8,1 }; int N = 6;
MSortClass<int> a;
a.SetK(array, N);
a.InsertSort();
a.DispR();
a.BinInsertSort();
a.DispR();
}