折半插入排序


這個是在上一篇插入排序的基礎上的改進。在查找第i個元素的正確位置的過程中,使用折半查找加速。數據量大的情況下效率應該有比較顯著的提升。

//折半插入排序
//lovesunmoonlight
//2017.3.24

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;

#define MAX 10

typedef struct{
int key; //關鍵字
double data; //數據
}node;

typedef struct{
node r[MAX+1]; //r[0]的位置設置為哨兵
int len;
}List;

void binaryInsertSort(List& s)
{

for(int i=2;i<s.len;i++)
{
s.r[0]=s.r[i]; //保存到哨兵
int low=1;
int high=i-1;
int mid=low+(high-low)/2;
while(low<=high)
{
if(s.r[0].key<s.r[mid].key)
{
high=mid-1;
}
else
{
low=mid+1;
}
mid=low+(high-low)/2;
}
int j;
for(j=i-1;j>=high+1;j--)
{
s.r[j+1]=s.r[j];
}

s.r[high+1]=s.r[0];
}
}

void output(const List& s)
{
cout<<"Key Data"<<endl;
for(int i=1;i<s.len;i++)
cout<<s.r[i].key<<" "<<s.r[i].data<<endl;
cout<<endl;
}

int main()
{
List s;

//初始化表
s.len=MAX+1;
s.r[0].key=0;
s.r[0].data=-1;
for(int i=1;i<s.len;i++)
{
s.r[i].data=rand()%100;
s.r[i].key=rand()%50;
}
cout<<"Initialized: "<<endl;
output(s);
binaryInsertSort(s);
cout<<"After binaryInsertSort: "<<endl;
output(s);


return 0;
}
結果:





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: