对于时间复杂度来说折半插入排序和插入排序相比并没有质的飞跃,只是比较的次数少了一些。
算法稳定性:稳定
复杂度分析:
- 空间复杂度:O(1)
- 最好时间复杂度(全部有序):O(n)
- 平均时间复杂度:O(n^2)
- 最坏时间复杂度(全部逆序):O(n^2)
实现代码:
#include<iostream>
using namespace std;
//折半插入排序
int nums[155];
//折半查找
int BinFind(int *nums,int low,int high,int x){
while(low<=high){
int mid=(low+high)/2;
if(x<nums[mid]) //为保证算法稳定性,当要插入的元素和查找到的元素相等时则继续往mid所指位置右边继续寻找要插入的位置
high=mid-1;
else
low=mid+1;
}
return low;
}
//带哨兵的折半插入排序
void BinInsertSort(int *nums,int n){
for(int i=2;i<=n;i++){
nums[0]=nums[i];
if(nums[i]<nums[i-1]){
int idx=BinFind(nums,1,i-1,nums[i]); //折半查找要插入的位置
for(int j=i-1;j>=idx;j--)
nums[j+1]=nums[j];
nums[idx]=nums[0];
}
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>nums[i];
BinInsertSort(nums,n);
for(int i=1;i<=n;i++)
cout<<nums[i]<<" ";
return 0;
}