排序第四章:希尔排序

希尔排序是一种改进的插入排序算法,通过增量序列实现批量移动记录,从而提高排序效率。其时间复杂度为O(n^(3/2)),优于直接插入排序的O(n²)。虽然增量序列的选择没有最优标准,但希尔排序在某些情况下(如记录基本有序或数量较少)表现出较高效率。

#define MAX_SIZE 10
typedef struct
{
int m[MAX_SIZE ];
int length;

} SqList;

//用排序,铁定跑不了这个swap函数,最好自己写一个

void swap(SqList *q, int i, int j);

void swap(SqList *q, int i, int j)
{
int temp = q->m[i];
q->m[i] = q->m[j];
q->m[j] = temp;

}


/*希尔排序,前面介绍的三种排序的时间复杂度都是O(n*n)

而这一次的希尔排序是第一批突破O(n*n)的排序算法

他的核心精髓是那个增量序列,每一次移动都是一个批量的序列移动

可是他应该选择什么作为增量呢?这一点,只能凭感觉了,没有确凿的数据证明,哪个是最好的增量序列,

自己根据实践去开发

希尔排序的时间复杂度是O(n^3/2)就是n的二分之三次方;要好过前面几章的N的平方!!!!

*/

/*前面的直接插入排序,有些时候效率是很高的,比如当记录本身就是有序的,只需要少许的插入操作,即可。

还有就是记录少的时候,也很高效,而这个希尔排序,其实和直接插入排序有点相像的,自己注意看啊!!!

*/

void shellsort(SqList *L)
{
int i, j, incream;
incream = L->length;
do
{
incream = incream / 3 + 1;    //增量序列
for (i = incream + 1; i <= L->length; i++)
{
if (L->m[i] < L->m[i - incream])
{    
L->m[0] = L->m[i];
for (j = i - incream; j > 0 && L->m[j] > L->m[0]; j -= incream)
{
L->m[j + incream] = L->m[j];//记录后移, 查找插入位置
}
L->m[j + incream] = L->m[0];    //插入
}
}
} while (incream > 1);


}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值