希尔排序
来源:互联网 发布:淘宝网店开店费用 编辑:程序博客网 时间:2024/06/03 15:56
希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。
一、基本思想
对待排记录序列先作“宏观”调整,再作“微观”调整。
所谓“宏观”调整,指的是 “跳跃式”的插入排序。即:将记录序列分成若干子序列,每个子序列分别进行插入排序。关键是,这种子序列不是由相邻的记录构成的。假设将n个记录分成d个子序列,则这d个子序列分别为:
{ R[1],R[1+d],R[1+2d],…,R[1+kd] }
{ R[2],R[2+d],R[2+2d],…,R[2+kd] }
…
{ R[d],R[2d],R[3d],…,R[kd],R[(k+1)d] }
其中,d称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为1。
下图为希尔排序示意图:
二、希尔排序的实现
代码
public void ShellSort(SeqList<int> R, int[] increment)
{
//希尔排序中的一趟排序,d为当前增量
int i, j, temp, d;
for (int m = 0; m < increment.Length; m++)
{
d = increment[m];
for (i = d; i < R.Length; i++) //将R[d+1..n]分别插入各组当前的有序区
if (R.Data[i] < R.Data[i - d])
{
temp = R.Data[i]; j = i - d;
do
{//查找R[i]的插入位置
R.Data[j + d] = R.Data[j]; //后移记录
j = j - d;//查找前一记录
} while (j > 0 && temp < R.Data[j]);
R.Data[j + d] = temp; //插入R[i]到正确的位置上
}
}
}
{
//希尔排序中的一趟排序,d为当前增量
int i, j, temp, d;
for (int m = 0; m < increment.Length; m++)
{
d = increment[m];
for (i = d; i < R.Length; i++) //将R[d+1..n]分别插入各组当前的有序区
if (R.Data[i] < R.Data[i - d])
{
temp = R.Data[i]; j = i - d;
do
{//查找R[i]的插入位置
R.Data[j + d] = R.Data[j]; //后移记录
j = j - d;//查找前一记录
} while (j > 0 && temp < R.Data[j]);
R.Data[j + d] = temp; //插入R[i]到正确的位置上
}
}
}
三、时间复杂度分析
大量研究证明,若增量序列的取值比较合理,希尔排序时关键字比较次数和记录移动次数接近于O(n(log2n)2)
由于希尔排序法是按增量分组进行的排序,所以希尔排序是不稳定的排序。
希尔排序法适用于中等规模的记录序列的排序的情况。
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- eclipse 的1个workspace如何同时容纳2个编码不同的项目【Eclipse文件转码插件】
- 从创业失败中学到的七条教训
- Ext.grid常用属性和方法
- linux和STL 常用头文件及说明
- Customize My Profile Tabs for SharePoint 2010
- 希尔排序
- 伤感QQ空间日志:痛在你离别之后
- 20+精美浏览器框架/边框PSD文件下载
- Windows系统坏了-MBR/ntldr/grldr/分区表/
- 前缀++类重载函数的返值为类名是不妥的-与吕凤翥老师等商榷
- ffmpeg解码流程
- Please make sure the -vm option in eclipse.ini is pointing to a JDK and verify that Installed JRE’s
- wp7.1 使用本地数据库
- 微软Project Natal三维测量原理