三、希尔排序
来源:互联网 发布:小众软件下载免费 编辑:程序博客网 时间:2024/06/10 21:26
- 序言
- 标准实现
- 图解
- 实例
- 标准代码
- 输入
- 运行结果
- 改良
- 输入
- 运行结果
- 其他
- code地址
- 引用
序言
希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
算法思路:
先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序
然后取 d2(d2 < d1)
重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,最后对这个组进行插入排序。一般选 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1。
标准实现
图解
实例
假设有数组 array = [80, 93, 60, 12, 42, 30, 68, 85, 10],首先取 d1 = 4,将数组分为 4 组,如下图中相同颜色代表一组:
然后分别对 4 个小组进行插入排序,排序后的结果为:
然后,取 d2 = 2,将原数组分为 2 小组,如下图:
然后分别对 2 个小组进行插入排序,排序后的结果为:
最后,取 d3 = 1,进行插入排序后得到最终结果:
标准代码
//实现方式 1A - 2A 2A - 3A 1B - 2B 2B - 3Bvoid shell_sort(Element *arr, int len) { int i, j, gap; for (gap = len / 2; gap > 0; gap /= 2) //步长 for (i = 0; i < gap; i++) //循环步长分组 { for (j = i + gap; j < len; j += gap) //步长递进.插入排序 if (arr[j] < arr[j - gap]) { int temp = arr[j]; int k = j - gap; while (k >= 0 && arr[k] > temp) { arr[k + gap] = arr[k]; k -= gap; } arr[k + gap] = temp; } }};
输入
void test_shell_sort(){ int len = 6; Element arr[6] = {1, 2, 3, 7, 6, 5}; shell_sort(arr, len); printArr(arr,len);};
运行结果
1 2 3 5 6 7
改良
//shell排序的另外一种思路. 1A - 2A 1B - 2B 2A-3A 2B-3Bvoid shell_sort_plus(int arr[], int len){ int j, gap; for (gap = len / 2; gap > 0; gap /= 2) for (j = gap; j < len; j++)//从数组第gap个元素开始 if (arr[j] < arr[j - gap])//每个元素与自己组内的数据进行直接插入排序 { int temp = arr[j]; int k = j - gap; while (k >= 0 && arr[k] > temp) { arr[k + gap] = arr[k]; k -= gap; } arr[k + gap] = temp; }}
输入
void test_shell_sort_plus(){ int len = 6; Element arr[6] = {1, 2, 3, 7, 6, 5}; shell_sort_plus(arr, len); printArr(arr,len);};
运行结果
1 2 3 5 6 7
其他
其实还有一种实现是用交换的方式.
void shell_sort_swap(int arr[], int len){ int i, j, gap; for (gap = len / 2; gap > 0; gap /= 2) for (i = gap; i < len; i++) for (j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap) swap(&arr[j], &arr[j + gap]);}
code地址
https://github.com/HumorSmith/Alorthim/tree/master/sort
引用:
http://blog.csdn.net/morewindows/article/details/6668714
http://bubkoo.com/2014/01/15/sort-algorithm/shell-sort/
- 三、希尔排序
- 排序算法三 希尔排序
- C#算法 -- (三)希尔排序
- 排序算法之三-希尔排序
- 排序算法三:希尔插入排序
- 数据结构与算法三:希尔排序
- 排序算法_C++(三)插入排序之希尔排序
- 排序算法(三):插入排序法和希尔排序
- 八大排序学习之三希尔排序(Shell排序)
- 简单排序Java实现(三):希尔排序,堆排序
- 浅谈排序算法学习之希尔排序(三)
- 排序算法值三 —— 希尔排序
- JAVA实现排序算法(三):希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- linux 文件特殊权限
- greendao 3.2.2配置的时候报错:Unable to find method 'org.gradle.api.tasks.TaskInputs.file(Ljava/lang/Object;
- Kiki & Little Kiki 2
- 基于ggplot2的R 语言数据可视化(一)
- 分布式服务框架 dubbo/dubbox 入门示例
- 三、希尔排序
- Android酷炫实用的开源框架(UI框架)
- 【Matlab与线性代数】Matlab中对数组元素引用方法总结
- 基于DFA实现的敏感词过滤算法及在JFinal中的应用
- vcruntime140.dll
- linux中tcp连接内核参数调优somaxconn
- 学习笔记:在Windows系统中如何安装Oracle数据库
- Retrofit配置
- Java中throw和throws的区别