经典排序算法学习笔记四——希尔排序
2016-10-04 17:25
239 查看
希尔排序
数据结构 | 数组 |
---|---|
最差时间复杂度 | 根据步长序列的不同而不同。已知最好的:O(n*log ^{2}n) |
最优时间复杂度 | O(n) |
平均时间复杂度 | 根据步长序列的不同而不同。 |
最差空间复杂度 | O(n) |
1、算法思想
先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;
然后取d2<d1,重复上述分组和排序操作;
直至di=1,即所有记录放进一个组中排序为止。
我是栗子,栗子,栗子
假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 然后我们对每列进行排序: 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序: 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 排序之后变为: 10 14 13 25 23 33 27 25 59 39 65 73 45 94 82 94 最后以1步长进行排序(此时就是简单的插入排序了)。 |
2、伪代码
input: an array a of length n with array elements numbered 0 to n − 1 inc ← round(n/2) while inc > 0 do: for i = inc .. n − 1 do: temp ← a[i] j ← i while j ≥ inc and a[j − inc] > temp do: a[j] ← a[j − inc] j ← j − inc a[j] ← temp inc ← round(inc / 2)
3、实现
#include <stdio.h> #include <stdlib.h> void shell_sort(int arr[], int len) { int gap, i, j,n=0; int temp; for (gap = len /2; gap > 0; gap /= 2){ for (i = gap; i < len; i++) {//gap=1时就是直接插入排序了,首先要理解插入排序 temp = arr[i]; for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) arr[j + gap] = arr[j]; arr[j + gap] = temp; } n++; printf("\n第%d次sorted:\n",n); printf("gap=%d\n",gap); for (i = 0; i < len; i++) printf("%d ", arr[i]); } } int main() { int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; int len = (int) sizeof(arr) / sizeof(*arr); int i; printf("before shell_sort:\n"); for (i = 0; i < len; i++) printf("%d ", arr[i]); shell_sort(arr, len); printf("\n最后结果:\n"); for (i = 0; i < len; i++) printf("%d ", arr[i]); system("pause"); return 0; }
相关文章推荐
- 经典排序算法学习笔记七——堆排序
- 深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构,学习笔记大放送
- 经典排序算法学习笔记五——直接选择排序
- 经典排序算法学习笔记二——快速排序
- [学习笔记]Java排序算法:希尔排序(Shell排序)
- 经典排序算法学习笔记六——归并排序
- Linux C学习笔记-排序算法5-希尔排序
- 经典排序算法学习笔记
- 经典排序算法学习笔记一——冒泡排序
- SQL Server 2005 学习笔记系列文章导航 存储过程分页的经典例子
- Entity Bean(经典学习笔记之一)
- 经典网络工程师学习笔记大全(一)
- 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
- 操作系统学习笔记(10) 互斥和同步的经典问题
- c#经典入门--学习笔记
- Visaul C++ 2010 入门经典 学习笔记(1)
- mini-web学习笔记之经典CRUD显示页面总结
- 入门帖: Lotus 学习笔记(新手必进,经典资料)
- c#经典入门学习笔记-封箱和拆箱
- 2011/5/28操作系统学习笔记之经典同步问题