#include<stdio.h>
#include<stdlib.h>
#define Status int
#define max 20
typedef struct {
Status key;
}ElemType;
typedef struct {
ElemType r[max];
int length;
}Sqlist; //结构体的定义
void Inital(Sqlist &L) //初始化数组
{
L.r[1].key=49;
L.r[2].key=38;
L.r[3].key=65;
L.r[4].key=97;
L.r[5].key=76;
L.r[6].key=13;
L.r[7].key=27;
L.r[8].key=49;
L.length=8;
}
bool LT(int i,int j) //比较两个数的大小
{
if(i<j)
return true;
else return false;
}
void BInsertsort(Sqlist &l) //这般插入排序函数(根据直接插入排序改变)
{
int i,j,low,high,m; //low最小值,high最大值,m中间值
for(i=2;i<=l.length;++i) //从第二个元素开始一个一个向以排好的序列中插入
{
l.r[0]=l.r[i]; //将新插入的元素放到哨兵位置
low=1;high=i-1; //在应经排好的序列中,将1付给最小值,最后一个元素位置付给最大值
while(low<=high) //查找i的插入位置
{
m=(low+high)/2; //找排好的序列中的平均值
if(LT(l.r[0].key,l.r[m].key)) high=m-1; //通过比较看新插入的元素在哪半个区间
else low =m+1;
}
for(j=i-1;j>=high+1;--j) l.r[j+1]=l.r[j]; //同直接插入排序,记录后移
l.r[high+1]=l.r[0]; //插入
}
}
void print(Sqlist l) //输出
{
int i;
printf("排序后的结果为:");
for(i=1;i<=l.length;i++)
{
printf("%d ",l.r[i].key);
}
}
void main()
{
Sqlist l;
Inital(l);
BInsertsort(l);
print(l);
getchar();
getchar();
}
//算法分析:1.折半插入排序基本和直接插入排序一样,只是在选择新记录点的位置的时候折半插入排序是对现有序列一半来比对
//2.折半查找比顺序查找快,所以折半插入排序的平均性能比直接插入排序要快
//3.它所需要的排序码的比较次数与待排序对象序列的初始排序无关,仅仅依赖于对象的个数
//4.它的时间复杂度为O(nlogn);
//5.它只是减少了比较的次数,但是移动记录的次数是没有变的
//6.当初始序列接近有序或是已经有序的时候,直接插入排序比较次数要比折半插入排序的比较次数少
//7.折半插入排序是稳定的。
排序算法------折半插入排序
最新推荐文章于 2023-07-25 10:20:59 发布