简介
当直接插入排序进行到某一趟时,对于数据来讲,前边n个记录已经按关键字有序。此时不用直接插入排序的方法,而改为折半查找,找出应插的位置然后插入,这种方法就是折半插入排序(Binary Insertion Sort)。折半插入排序是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。
算法思路
在插入到已排序的数据时采用来折半查找(二分查找),取已经排好序的数组的中间元素,与插入的数据进行比较,如果比插入的数据大,那么插入的数据肯定属于前半部分,否则属于后半部分,依次不断缩小范围,确定要插入的位置。
代码
#include <QDebug>
#include <QApplication>
void mDebug(int a[], int len)
{
QString str;
for (int i = 0; i < len; i++)
{
str += QString("%1 ").arg(a[i]);
}
qDebug() << str;
}
template<class T>
void BinaryInsertionSort(T a[],int len)
{
// 进行len-1趟插入
for (int i = 1; i < len; i++)
{
// l:地位 h:高位
int l = 0;
int h = i - 1;
T temp = a[i];
// 采用折半查找法找到待插入位置
while (l <= h)
{
int m = (l + h) / 2;
if (a[m] > temp)
h = m - 1;
else
l = m + 1;
}
// 找到待插入位置后,需要把待插入位置后到要比较的位置的数值都往后移一位
for (int j = i; j > l; j--)
{
a[j] = a[j - 1];
}
// 如果待插入位置与比较的位置不同则插入
if(i != l) a[l] = temp;
mDebug(a, len);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
int s[] = {50, -1, 3, 4, 0, 5, 1000, 6, 7, 12, 8, 1, 2, 9, -530, 450, 77} ;
int len = sizeof(s)/sizeof(s[0]);
BinaryInsertionSort(s, len);
mDebug(s, len);
return a.exec();
}
输出
"-530 -1 0 1 2 3 4 5 6 7 8 9 12 50 77 450 1000 "