Shell 排序

分类: 算法 C 2008-09-17 11:02 1898人阅读 评论(4) 收藏 举报
刚才在CSDN的C语言板块看到了有人说Shell排序的问题,所以一起学习了一下,并进行如下总结

shell排序的思想是根据步长由长到短分组,进行排序,直到步长为1为止,属于插入排序的一种。下面用个例子更好的理解一下

无序数列: 32, 43,56,99,34,8,54,76

1.首先设定gap=n/2=4于是分组
32,34    排序  32,34
43, 8             8, 43
56,54            54,56
99,76            76,99
数列变成 32,8,54,76,34,43,56,99

2.gap=gap/2=2 于是分组
32,54,34,56  排序  32,34,54,56
8,76,43,99            8,43,76,99
于是数列变成 32,8,34,43,54,76,56,99

3.gap=gap/2=1于是分组
32,8,34,43,54,76,56,99 排序
8,32,34,43,54,56,76,99
gap=1结束……

相应的C语言代码引用K&R C程序设计一书中给出的代码

void shellsort(int v[], int n)
{
int gap, i, j, temp;
for(gap=n/2;gap>0;gap/=2) //设定步长
    for(i=gap;i<n;++i) //在元素间移动为止
        for(j=i-gap; j>=0&&v[j]>v[j+gap]; j-=gap){ //比较相距gap的元素,逆序互换//我看不懂为啥是个for不是if 20140220
            temp=v[j];
            v[j]=v[j+gap];
            v[j+gap]=temp;
       }
}

以上就为Shell排序的相关总结,以后想到的再添加……

更多
0

 
查看评论
4楼 insulted 2009-08-17 12:19发表 [回复]
当然了,博主原来的代码看起来更紧凑简洁一些,呵呵!
3楼 insulted 2009-08-17 12:15发表 [回复]
如果要体现博主中说的“属于插入排序的一种”的话,最好的代码应该是这样子的:
for(gap=n/2;gap&gt;0;gap/=2) //设定步长
for(i=gap;i&lt;n; i) //在元素间移动为止
{
if (v[i] &lt; v[i-gap])
{
temp = v[i];
for (j=i-gap; j&gt;=0 &amp;&amp; temp&lt;v[j]; j-=gap)
v[j gap] = v[j];
v[j gap] = temp;
}
}

请博主再看看

2楼 insulted 2009-08-17 11:58发表 [回复]
博主中提到“shell排序的思想是根据步长由长到短分组,进行排序,直到步长为1为止,属于插入排序的一种。下面用个例子更好的理解一下”
但是最后给的code中的最内层循环,其实不是插入排序的实现,貌似是打擂台的冒泡排序。您再看看?
1楼 insulted 2009-08-17 09:47发表 [回复]
very good!
thanks a lot!

ZT Shell 排序的更多相关文章

  1. 基本排序算法——shell排序java实现

    shell排序是对插入排序的一种改进. package basic.sort; import java.util.Arrays; import java.util.Random; public cla ...

  2. 插入排序与shell排序(希尔排序)

    1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方. 插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入.不断重复上述过 ...

  3. Java常见排序算法之Shell排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. js实现shell排序

    //shell排序配插入排序function shell_insert_sort(arr){ var gap = arr.length; do{ gap = parseInt(gap/3) + 1; ...

  5. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  6. 数据结构学习——shell排序的C语言实现

    shell排序: 这个排序的命名是来自发明者的名字,和排序的方法没有字面上的联系.所以不要因为名字而感觉很难.在K&R的C程序设计语言中书中只用了几行代码很简洁的实现了这个排序算法.那就来看看 ...

  7. shell排序算法

    今天看<The C Programming Language>的时候看到了shell排序算法, /* shellsort: sort v[0]...v[n-1] into increasi ...

  8. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  9. Java排序算法(四):Shell排序

    [基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直 ...

随机推荐

  1. c#基础学习(0719)之异常处理

    异常处理的一般代码模式 try { //可能发生异常的代码 //当try中某行代码发生异常后,从该行代码开始,后面的代码都不会继续执行, //程序直接跳转到catch块中进行执行 } catch (E ...

  2. MVC 之HTML辅助方法

    顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HT ...

  3. [C语言] 数据结构-逻辑结构和物理结构

    数据结构:相互之间存在一种或多种特定关系的数据元素的集合 1.数据结构分为逻辑结构和物理结构 集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系 线性结构:线性结构中的数据元素之 ...

  4. 高性能分布式锁-redisson

    RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...

  5. 安装SQL SEVER 2017 express 轻量入门级软件 安装教程

    1. 首先 打开网址   https://www.microsoft.com/zh-tw/sql-server/sql-server-downloads     点击下载 , 下载完成之后, 点开安装 ...

  6. POJ3087(KB1-G 简单搜索)

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10366   Accepted: 4800 Des ...

  7. 关于pycharm 打不开某些文件夹和文件打不开的问题

    在使用pycharm的时候遇到了一个情况, 下载了一个文件,自己修改了文件夹名称后再打开文件夹里的py文件, 打不开了,pycharm没有反应, 百度了一下,没有类似的问题,觉得应该是个个例... 然 ...

  8. js-用于检测类数组对象的函数

    //判定o是否是一个类数组对象 //字符串和函数有length属性,但是它们 //可以用typeof检测将其排除.在客户端JavaScript中,DOM文本节点 //也有length属性,需要用额外判 ...

  9. js和jquery中获取非行间样式

    样式又分为了行间样式和非行间样式.一般来说行间样式用的是比较少的,因为它能够作用的范围就只有一个元素,而非行间样式的作用范围可以是一类元素(即拥有相同德标签,或者说是有相同的类名,(当然id名不可能相 ...

  10. C#基础 继承和实例化

    有代码如下,问输出的是多少: class Program { static void Main(string[] args) { B b = new B(); Console.ReadKey(); } ...