排序(希尔排序)
2015-11-28 13:12
225 查看
1、希尔排序的简单介绍
希尔排序(shellSort)出自D.L.Shell,所以取名shell,是基于直接插入排序一种不稳定的排序方法,又称“缩小增量排序”。希尔排序的基本思想就是:将待排序的元素分成若干组,对这些组分别进行直接插入排序,使得所有的分组有序排列,再缩小分组的范围(增量),对缩小后的若干分组继续进行分组插入排序,当范围越来越小,直到为1时,进行最后一次排序,就可以保证所有的元素都有序。
具体的实现过程:
1.1、确定每次分组的增量,假设现有10个元素,可以将增量设为5,2,1,0
1.2、将每个分组中的元素分别进行排序,设增量为d,分组首元素下标为i,待排序的元素就是i,i+d,i+2d,i+3d……
重复上述1,2步,直到所以的元素有有序,希尔排序的基本流程是:
2、希尔排序C语言的实现
void shellSort(int *arr,int n) { int i,j,k,dk,*delta,key; delta=(int *)malloc(sizeof(int)*n/2); for(i=0,k=n; k>0; k/=2,i++) //预处理,求出每次划分的增量并保存 delta[i]=k/2; //进行分组插入排序 for(i=0; delta[i]>0; i++) { for(dk=k=delta[i]; k<n; k++) { if(arr[k]<arr[k-dk]) { key=arr[k]; for(j=k-dk;j>=0&&arr[j]>key;j-=dk) arr[j+dk]=arr[j]; arr[j+dk]=key; }//if }//for }//for }
3、希尔排序的效率分析
由上面的图可以看出,shell排序是一种不稳定的排序方法,两个值相同的元素,排序之后,先后顺序发生了改变,虽然排序过程使用了三层循环,但其时间复杂度为O(n^1.3),而整个排序过程,需要一个变量为辅助的转存空间,所以空间复杂度为O(1)。相关文章推荐
- 在命令行用 sort 进行排序
- 文件遍历排序函数
- C#数据结构之顺序表(SeqList)实例详解
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- C#实现Datatable排序的方法
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#通过IComparable实现ListT.sort()排序
- C#数据结构之单链表(LinkList)实例详解
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- 数据结构之Treap详解
- C#折半插入排序算法实现方法