排序二:希尔排序
来源:互联网 发布:java经典书籍 编辑:程序博客网 时间:2024/06/07 10:22
概念
希尔排序又称为缩小增量排序,它是一种插入排序,是直接插入排序的优化。与直接插入排序不同的是它按照间距gap分组,对间距为gap的数进行插入排序。
步骤
① . 预排序:令gap=x,对间距为x的数据进行插入排序,gap数值逐渐减小gap = gap/3+1;(此时接近有序);
② . 直接插入排序:当gap=1(为有序数列)。
代码:
//希尔排序void ShellSort(int*a, size_t n){ assert(a); int gap = n; while (gap > 1) { gap = gap/3+1; for (size_t i = 0; i < n-gap; i+=gap) { int end = i; int tmp = a[end + gap]; while (end >= 0) { if (tmp>a[end]) { a[end + gap] = a[end]; end -= gap; } else break; } a[end + gap] = tmp; } }}int main(){ int arr[] = { 2, 4, 1, 3, 5 }; int length = sizeof(arr) / sizeof (arr[0]); ShellSort(arr, length); for (int i=0; i < length; ++i) { cout << arr[i] <<" "; } cout << endl;}
运行结果:
时间复杂度
平均时间复杂度O(N^1.25)~O(1.6N^1.25)
空间复杂度
O(1)
稳定性
不稳定,因为有间距所以相同数据可能会交换位置
希尔排序与直接插入排序比较
① . 稳定性不同;希尔不稳定,直接插入稳定。
② . N较大时用希尔排序,希尔的比较次数和移动次数都要比直接插入排序少;N较小且接近有序时用直接插入排序更快。
③ . 直接插入排序也适用于链式存储结构;希尔排序不适用于链式结构。
阅读全文
0 0
- 排序(二)---希尔排序
- 排序二:希尔排序
- 排序之二:希尔排序
- 排序(二):希尔排序
- 排序(二)----希尔排序
- 希尔排序-Java<二>
- 神奇的希尔排序二
- 排序算法二-堆,希尔,合并排序
- 从排序开始(二) 希尔排序
- 排序算法(二):希尔排序
- 八大排序算法(二)希尔排序
- 排序算法(二):希尔排序
- 排序算法 -- (二)希尔排序
- 排序算法(二)---- 希尔排序
- 排序算法(二)希尔排序
- 排序算法(二)希尔排序
- 排序算法二(归并排序、快速排序、希尔排序)
- (二)插入排序:直接插入排序,希尔排序
- 关于蓝牙权限的获取与开启
- cocos2d-x + vs2015 android游戏开发环境搭建 及 新建项目
- 带头结点的单链表和不带头结点的单链表的倒数第K个节点
- Find The Multiple
- BZOJ 1036: [ZJOI2008]树的统计Count (LCT题解)
- 排序二:希尔排序
- 新手上路之 js undefined问题
- 牛客网剑指offer-从尾到头打印链表
- maven构建hibernate项目及其详解
- GCD功能介绍与实践
- Win10如何安装vs2015+cocos2d-x 3.9开发环境?安装配置教程分享
- 数组逆序
- 数据结构(第二天)单向循环链表的创建,插入元素,(删除、查询元素跟单链表操作基本一致)
- Java重载时,存在多个匹配的方法该如何选择?