0
点赞
收藏
分享

微信扫一扫

【排序算法(二)】希尔排序

hoohack 2022-02-03 阅读 144

希尔排序

将待排序的记录分割成子序列,整体序列是基本有序的,再在这些子序列中进行直接插入排序。
所谓基本有序,就是小的关键字基本在前面,大的基本在后面。
如何将记录分割成子序列:跳跃分割的策略。将相距某个增量的记录组成一个子序列。

示例代码:和直接插入排序的区别在于increment增量的设计

void ShellSort(SqList *L){
	int i,j;
	int increment = L->length;
	do {
		increment = increment/3+1;/*增量序列*/
		for(i=increment+1;i<L->length;i++){
			if(L->[i]<L->[i-increment]){
				L->[0] = L->[i];
				for(j=i-increment;j>0&&L->[j]>L->[0];j-=increment){
					L->[j+increment] = L->[j];
				}
				L->[j+increment] = L->[0];
			}
		}
	}
	while(increment>1);
}

增量序列的选择很关键。增量序列的最后一个值必须是1,才能遍历所有的元素。希尔排序不是稳定的,时间复杂度可以达到O(n^3/2)。

举报

相关推荐

0 条评论