概述:
折半插入排序利用二分法的思想,在一个有序的序列中,找到待插入元素在该序列中的位置,然后插入。
假设共有n个元素,前i个元素已经是有序序列,现要将第i个元素插入其中,应利用折半查找思想找到待插入元素的正确位置,将此位置之后的元素逐个向后移动,然后再插入。
思路:
查找、向后移动、插入。
折半插入排序算法相比较于直接插入排序算法,从时间上比较,折半插入排序只是减少了关键字间的比较次数,而记录的移动次数不变,所以该算法的时间复杂度仍是O(n²),而且是稳定的。
折半插入排序与直接插入排序基本思路一致,只是在查找待插入位置时不是从后往前依次查找,而是使用折半查找。
代码:
//折半插入排序
#include <iostream>
using namespace std;
void Print(int array[],int length){ //自定义输出函数,每执行一次打印一次序列
for(int i=0;i<length;i++){
cout<<array[i]<<" ";
}
cout<<endl;
}
void BInsertSort(int array[],int length){
int i;
int low,high,mid;
for(i=1;i<length;i++){
low=0; //左右边界初始化
high=i-1;
int key=array[i];
while(low<=high){ //折半查找思想
mid=(low+high)/2;
if(array[mid]>=key){
high=mid-1; //折半,右边界移到mid左边一位
}
else{
low=mid+1; //折半,左边界移到mid右边一位
}
}
for(int j=i-1;j>=high+1;j--){
array[j+1]=array[j]; //high+1处及其后面的元素都往后移
}
array[high+1]=key; //将key插入到high+1处
Print(array,length);
}
}
int main(){
int array[]={49,38,65,97,76,13,27,49};
int length=sizeof(array)/sizeof(*array);
Print(array,length); //先打印原始序列
BInsertSort(array,length);
}