博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
希尔排序
阅读量:5960 次
发布时间:2019-06-19

本文共 1305 字,大约阅读时间需要 4 分钟。

 希尔排序(shellsort)又叫增量递减(diminishing increment)排序,是由D.L. Shell发明的,这个算法是通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。
假设有一个数组int data[16] = {...}。 首先将这个增量设为16 / 2 = 8, 这样就将这个数组分成了8个子数组,它们的索引是0, 8    1, 9   2, 10等等 。对这些子数组进行排序。然后再使增量为8 / 2 = 4,这样就将原数组分成了4个子数组,它们的索引分别是0, 4, 8, 12    1, 5, 9, 13等等。再对这四组数进行排序,直到增量为1。

    以上所描述的增量递减只是一种方法,这种方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1  f(1) = 1   (..., 121, 40, 13,  4, 1)就比上面的取增量的方法好。这种方法的时间复杂度是O(n ^1.5)。

算法如下:

#include 
void output_array(int data[], int n){ int i; for(i = 0; i < n; i++) printf("%d ", data[i]); printf("\n");}void swap(int *a, int *b){ int x; x = *a; *a = *b; *b = x;}void insertion_sort(int data[], int n, int increment){ int i, j; for(i = increment; i < n; i += increment) for(j = i; j >= increment && data[j] > data[j - increment]; j -= increment) swap(&data[j], &data[j - increment]);}void shellsort(int data[], int n){ int i, j; for(i = n / 2; i > 2; i /= 2) for(j = 0; j < i; j++) insertion_sort(data + j, n - j, i); insertion_sort(data, n, 1);}int main(){ int data[] = {5, 3, 1, 665, 77, 66, 44, 11, 10, 9, 8, 6}; output_array(data, 12); shellsort(data, 12); output_array(data, 12); return 0;}
源:

转载于:https://www.cnblogs.com/arbboter/archive/2012/10/22/4225226.html

你可能感兴趣的文章
Template Method(模板方法)模式
查看>>
Dynamic proxy (good-原创)
查看>>
【Redis】Java之Redis工具类
查看>>
算法系列15天速成——第十一天 树操作(上)
查看>>
MySQL中游标使用以及读取文本数据
查看>>
Kubernetes部署的最佳安全实践
查看>>
理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串
查看>>
Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化
查看>>
关于多线程中使用SendMessage
查看>>
【云栖大会】阿里云移动云Apsara Mobile重磅发布 推出Cloud Native App全新研发范式...
查看>>
【PMP】Head First PMP 学习笔记 第九章 人力资源管理
查看>>
2015年末必备前端工具集
查看>>
【Solidity】8. 杂项 - 深入理解Solidity
查看>>
关于在VS2005中编写DLL遇到 C4251 警告的解决办法
查看>>
Go语言大神亲述:历七劫方可成为程序员!
查看>>
用友优普发布企业空间2.0 助推企业互联网+
查看>>
文思海辉:大数据发展—源于创新、服务于创新
查看>>
中产委廖明:给中国制造转型的三点建议
查看>>
记一场为未来就绪的企业客户峰会
查看>>
5G来了 中国移动将孵化各种垂直应用 实现万物互联
查看>>