C++实现折半插入排序

来源:互联网 发布:回归分析对数据的要求 编辑:程序博客网 时间:2024/06/07 14:51

在“C++实现直接插入排序”中,由于插入排序的基本操作是在一个有序表中进行查找和插入,则这个“查找”操作可以利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序

实现如下:

#include<iostream>using namespace std;#define SIZE_A 9int main(){void myshow(int*  p,int length);//函数提前声明int list[SIZE_A]={-1,49,38,65,97,76,13,27,49};cout<<"排序前:"<<endl;myshow(list,SIZE_A);//折半插入排序,位置【0】辅助空间,真正要排序的数据在位置【1】~【length-1】for(int i=2;i<sizeof(list)/sizeof(int);i++){list[0]=list[i];//将待插入数据暂存至位置【0】int low=1;int high=i-1;while(low<=high){//在【low】和【high】中折半查找有序插入的位置int middle=(low+high)/2;//折半if(list[0]<list[middle]){//插入位置在前半段high=middle-1;}else{//插入位置在后半段low=middle+1;}}//whilefor(int j=i-1;j>=high+1;j--){//记录后移list[j+1]=list[j];}list[high+1]=list[0];//插入}//forcout<<"排序后:"<<endl;myshow(list,SIZE_A);return 0;}/*description:在标准输出设备上显示数组元素。parameter:int* p:指向整形数组首元素的指针int length:整形数据长度*/void myshow(int*  p,int length){for(int i=0;i<length;i++){cout<<*(p+i)<<"\t";}cout<<endl;}

运行结果为:

时间与空间复杂度分析

空间复杂度:

从上述实现可以看出,折半插入排序所需辅助空间和直接插入排序相同(都只需要一个辅助空间,即哨兵);

时间复杂度:

折半插入排序仅仅减少了关键字比较的次数,而记录的移动次数不变。因此,折半插入排序的时间复杂度仍为O(n*n)。

0 0
原创粉丝点击