Shell排序算法及C语言实现
2014-10-22 19:30
134 查看
Shell排序算法是D.L.Shell于1959年发明的,其基本思想是:先比较距离远的元素,而不是像简单交换排序算法那样先比较相邻的元素。这样可以快速减少大量的无序情况,从而减轻后续的工作。被比较的元素之间的距离逐步减少,直到减少为1,这时排序变成了相邻元素的互换。该方法实质上是一种分组插入排序方法。
先贴代码。
以v[10]={49,38,65,97,76,13,27,49,55,4}为例,
第一个外循环,gap=5,分别比较(v[0],v[5]),(v[1],v[6]),(v[2],v[7]),(v[3],v[8]),(v[4],v[9]),结果为{13,27,49,55,4,49,38,65,97,76}。
第二个外循环,gap=2,分别比较(v[0],v[2],v[4],v[6],v[8]),(v[0],v[2],v[4],v[6],v[8]),即分别对其进行插入排序,结果为{4,27,13,49,38,55,49,65,97,76}。
第三个外循环,gap=1,结果为{4,13,27,38,49,49,55,65,76,97}。
先贴代码。
/*shellsort函数:按递增顺序对v 数组进行排序*/ void shellsort(int v[],int n) {
int gap,i,j,temp; //gap为比较的间隔,从n/2开始,一直到1 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) { temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } }
以v[10]={49,38,65,97,76,13,27,49,55,4}为例,
第一个外循环,gap=5,分别比较(v[0],v[5]),(v[1],v[6]),(v[2],v[7]),(v[3],v[8]),(v[4],v[9]),结果为{13,27,49,55,4,49,38,65,97,76}。
第二个外循环,gap=2,分别比较(v[0],v[2],v[4],v[6],v[8]),(v[0],v[2],v[4],v[6],v[8]),即分别对其进行插入排序,结果为{4,27,13,49,38,55,49,65,97,76}。
第三个外循环,gap=1,结果为{4,13,27,38,49,49,55,65,76,97}。
相关文章推荐
- OO in C(2): C语言的多态实现
- 用C语言实现参数个数可变的函数
- 链表的c语言实现(三)
- lzw压缩算法的c语言实现
- c语言中时间陷阱的实现
- DataStructure---LinkList 链表C语言实现代码
- 链表的c语言实现(四)
- 求{1,2,3,...m}的幂集之C语言实现
- C语言中的面向对象(2)-C语言的多态实现
- C语言使用openSSL库DES模块实现加密功能详解
- C语言实现MATLAB 6.5中M文件的方法
- 用C语言来实现hex文件到coe文件的转化[原创]
- 链表的c语言实现(二)
- 用C语言实现八数码问题
- 用C语言实现UCS-2和UTF-8之间的互相转化
- OO in C(2): C语言的多态实现
- 求住 谁能帮我用java或c语言 实现一下公式 任意输入数字可出结果~~
- 链表的C语言实现(五)
- 用c语言实现艺术清屏
- 用c语言实现文件拷贝