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. dev的控件放在没有runat="server"的标签中,回调出现的问题

    dev的控件放在没有runat="server"的标签中,第一次回调是会刷新页面, 有runat="server"时不会刷新页面

  2. FineUI分组显示弹框最新的在最上边

    function TOBTCorrFun(obj){ var msgContent = JSON.parse(obj.dataJson); var tJson = JSON.stringify(obj ...

  3. 【转】启动tomcat的时候一直卡在INFO: Deploying web application

    在用centos7.+不熟tomcat项目的时候,启动时突然很奇怪的没报错,但是又访问不了网址,调用./shutdown.sh又结束不了,一直出现: java.net.ConnectException ...

  4. java实现返回一个字符串所有排列

    今天偶然看到了一个笔试题,觉得挺有意思,分享一下解题思路 public void permute(String string); public void permute(char[] chars , ...

  5. 前端框架 vue 和 react 的区别

    前言:最近需要使用 react,以前用过 vue,故来总结两者的区别. 首先React与vue有几点相同之处 1.都使用了Virtual DOM 2.提供了响应式(Reactive)和组件化(Comp ...

  6. js 中使用 #region #endregion

    vs 和 vs code 都是可以支持 js 使用 #region 折叠代码的:code 我就不说了 同理vs 的: 首先下载 vs 插件,插件路径:https://archive.codeplex. ...

  7. java-集合小结

    Java集合框架提供了一套性能优良.使用方便的接口和类,包括Collection和Map两大接口,它们都位于   java.util           包中.其中 Collection集合包含两个常 ...

  8. vue+vux 父组件控制子组件弹层

    知识点用到了vue父子组件之间的传值,以及使用watch和v-model控制vux中XDialog组件. 需要注意的问题: 1.父组件向子组件传值使用的是props(单向传值),子组件创建props, ...

  9. opencv3.2.0形态学滤波之开运算、闭运算

    /* 一.开运算: (1)开运算,其实就是先腐蚀后膨胀的过程. (2)数学表达式:dst = open(src,element) = dilate(erode(src,element)) (3)作用: ...

  10. Atitit.resin  could not create the java virtual machine问题

    Atitit.resin  could not create the java virtual machine问题 1. 正常的参数是这样1 2. 错误的cmd运行时候的参数1 3. 输出2 4. 原 ...