博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序算法总结--希尔排序
阅读量:4204 次
发布时间:2019-05-26

本文共 804 字,大约阅读时间需要 2 分钟。

希尔排序是一种改进的插入排序。前面我们讨论过插入排序在序列的大多数元素都是有序的情况下性能较好。所以希尔排序算法将原始的插入排序算法做了改进,每次比较不是相邻两个元素进行比较,而是隔几个元素之间进行比较,称为步长dk。通过不断缩小dk的值,逐步使得序列中元素有序。当dk缩小到1时,序列中的元素都已经基本有序,再进行插入排序就比较轻松了。

算法步骤:

1.选取合适的步长。可以选取元素个数的一半,也可以选1/3等等。

2.进行步长为dk的插入排序

3.缩小dk,进行递归

 

void Insort(int *a, int n, int dk) {	int j = 0;	for (int i = dk; i < n; ) 	{		j = i;		while (a[j] < a[j - dk])		{			swap(&a[j], &a[j- dk]);			j = j - dk;			if (j < dk)				break;		}		i = i + dk;	}	return;}void ShellSort(int *a, int n) {	int dk = n/2;        //    设置初始dk	while (dk >= 1) 	{		Insort(a, n, dk);		dk /= 2;	}	return;}

复杂度分析

时间复杂度分析:希尔排序的时间复杂度比较难分析,和序列本身以及步长的选择都有很大的关系,目前还没有个确定的值。查阅了基本数据结构的书籍以及网上的资料,众说纷纭。有两种主流的观点,一种认为是O(nlogn),一种则认为是O(N^3/2),总而言之希尔排序是一种较快的排序算法,速度介于冒泡和快排之间。但因为代码实现较为简单,在数据量较大的情况下也可以使用。

空间复杂度:只有递归消耗的栈空间。所以这个也和选择步长的计算方法有关。上面的例子空间复杂度就是O(logn).

转载地址:http://guali.baihongyu.com/

你可能感兴趣的文章
stdin,stdout,stderr详解
查看>>
Linux文件和设备编程
查看>>
文件描述符
查看>>
终端驱动程序:几个简单例子
查看>>
登录linux密码验证很慢的解决办法
查看>>
fcntl函数总结
查看>>
HTML条件注释
查看>>
Putty远程服务器的SSH经验
查看>>
内核态与用户态
查看>>
使用mingw(fedora)移植virt-viewer
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>
MySQL必知必会 -- 了解SQL和MySQL
查看>>
MySQL必知必会 -- 使用MySQL
查看>>
MySQL必知必会 -- 数据检索
查看>>
MySQL必知必会 -- 排序检索数据 ORDER BY
查看>>
MySQL必知必会 -- 数据过滤
查看>>
MYSQL必知必会 -- 用通配符进行过滤
查看>>
MYSQL必知必会 -- 用正则表达式进行搜索
查看>>
MySQL必知必会 -- 创建计算字段
查看>>