希尔排序
2015-09-21 15:41
267 查看
算法描述:
希尔排序是插入排序的一种改良。在插入排序中,每次交换都是相邻的元素进行交换,如果一个很小的元素在数组的末尾,那么将它移动到数组的前面来需要很多次的交换,效率较低。
希尔排序的思想是使数组中任意间隔为h的元素是有序的。这样的数组被称为h有序数组。如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。我们能够将数组排序,直至h为1。
算法实现:
class Shell
{
public:
static bool sort(int *a, int iLength)
{
int h = 1;
while(h < iLength / 3) h = h * 3 + 1;
while(h >= 1)
{
/* 将数组变为h有序 */
for(int i = h; i < iLength; i++)
{
for(int j = i; j >= h && a[j] < a[j - h]; j -= h)
{
int temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
}
}
h /= 3;
}
}
};
该算法中,我们制造了一个h序列:1,4,13,40,121...。然后将数组变成h有序,当数组为“1有序”的时候,排序完成。
时间复杂度:
算法的性能取决于h,还取决于h之间的数学性质,比如它们的公因子,很显然,公因子越少的h序列,该算法的性能越高。
该算法比插入排序和选择排序快很多,能解决插入排序无法解决的一些问题,比如说倒序数组的排序。但是数学上还不知道该算法所需要的平均比较次数。目前最重要的结论是“希尔排序的运行时间达不到平方级别”。
空间复杂度:
o(1)
稳定性:
希尔排序是不稳定的,因为该算法并不仅仅是相邻元素之间的比较和交换。
适用情景:
1、中等大小的数组,该算法的运行时间是可以接受的,代码量小,而且不需要额外的内存空间;
希尔排序是插入排序的一种改良。在插入排序中,每次交换都是相邻的元素进行交换,如果一个很小的元素在数组的末尾,那么将它移动到数组的前面来需要很多次的交换,效率较低。
希尔排序的思想是使数组中任意间隔为h的元素是有序的。这样的数组被称为h有序数组。如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。我们能够将数组排序,直至h为1。
算法实现:
class Shell
{
public:
static bool sort(int *a, int iLength)
{
int h = 1;
while(h < iLength / 3) h = h * 3 + 1;
while(h >= 1)
{
/* 将数组变为h有序 */
for(int i = h; i < iLength; i++)
{
for(int j = i; j >= h && a[j] < a[j - h]; j -= h)
{
int temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
}
}
h /= 3;
}
}
};
该算法中,我们制造了一个h序列:1,4,13,40,121...。然后将数组变成h有序,当数组为“1有序”的时候,排序完成。
时间复杂度:
算法的性能取决于h,还取决于h之间的数学性质,比如它们的公因子,很显然,公因子越少的h序列,该算法的性能越高。
该算法比插入排序和选择排序快很多,能解决插入排序无法解决的一些问题,比如说倒序数组的排序。但是数学上还不知道该算法所需要的平均比较次数。目前最重要的结论是“希尔排序的运行时间达不到平方级别”。
空间复杂度:
o(1)
稳定性:
希尔排序是不稳定的,因为该算法并不仅仅是相邻元素之间的比较和交换。
适用情景:
1、中等大小的数组,该算法的运行时间是可以接受的,代码量小,而且不需要额外的内存空间;
相关文章推荐
- 04 试一下,编写第一个JAVA程序
- Debian包管理工具——APT的工作原理详解
- 判断单向链表中是否有环
- Xcode里-ObjC, -all_load, -force_load
- 喜大普奔之终于会用C写Excel Function了
- gets函数哈scanf函数的区别
- LoghtOj1201(最大独立集)
- iOS—NSLog各种打印格式
- 由is_base_of看C++中的SFINAE
- 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)
- Discuz论坛搭建
- MS SQL 全局临时表的删除
- zabbix 设备(自己的实践)
- 洗牌算法
- html 锚点
- Android 官方推荐 : DialogFragment 创建对话框
- Openssl的安装
- IAR将变量定义在指定地址
- 解决xManager、putty等工具ssh连接linux中文乱码
- android布局相关