由一道编程题学会希尔排序
来源:互联网 发布:帝国cms 全站伪静态 编辑:程序博客网 时间:2024/06/05 22:33
/*
*SHELL排序程序。
该方法的特征是一个元素与它间隔为J 的元素进行比较或交换然后逐步缩小这个间隔到1为止。
J缩小的规律可以是 J<=J/2或J<=(J+1)/2我们取 J<=J/2取整编程。
具体地说方法如下对于N个数据首先让J<=INT(N/2)让X[1]与X[J+1]比较
假设数组名XX[2]与X(J+2)比较...X[N-J]与X[N]比较若次序颠倒则互相交换。
然后再重新比较一轮直到没有交换为止。
于是令J<=INT(J/2)再重复以上操作直到 J=1而且在这一轮比较中没有交换才排序完成。
题目难以看懂可以跳过!!!
例如 N=9 数据为 5 7 6 4 9 1 3 2 8 交换次数
J取4=INT(9/2) 5 1 3 2 8 7 6 4 9 4
再比较一轮 不变 0
J取2=INT(4/2) 3 1 5 2 6 4 8 7 9 3
再比较一轮 不变 0
J取1=INT(2/2) 1 3 2 5 4 6 7 8 9 4
再比较一轮 1 2 3 4 5 6 7 8 9 2
a[0] 和 a[4]比 a[1] 和 a[5]比 。。。 a[4] 和 a[8]比, 比到最后一位 ,当交换次数不为 0 继续比较一轮
当交换次数为0 则 每隔 N-1 个数字比大小 同上
。。。 。。。 。。。
当 N = 1 时候 , 同上,当交换次数为0 ,排序完成
此时 N = 0 (跳出循环条件)
*SHELL排序程序。
该方法的特征是一个元素与它间隔为J 的元素进行比较或交换然后逐步缩小这个间隔到1为止。
J缩小的规律可以是 J<=J/2或J<=(J+1)/2我们取 J<=J/2取整编程。
具体地说方法如下对于N个数据首先让J<=INT(N/2)让X[1]与X[J+1]比较
假设数组名XX[2]与X(J+2)比较...X[N-J]与X[N]比较若次序颠倒则互相交换。
然后再重新比较一轮直到没有交换为止。
于是令J<=INT(J/2)再重复以上操作直到 J=1而且在这一轮比较中没有交换才排序完成。
题目难以看懂可以跳过!!!
例如 N=9 数据为 5 7 6 4 9 1 3 2 8 交换次数
J取4=INT(9/2) 5 1 3 2 8 7 6 4 9 4
再比较一轮 不变 0
J取2=INT(4/2) 3 1 5 2 6 4 8 7 9 3
再比较一轮 不变 0
J取1=INT(2/2) 1 3 2 5 4 6 7 8 9 4
再比较一轮 1 2 3 4 5 6 7 8 9 2
再比较一轮 不变停止 0
读者可以试着分析上下面这个排序的过程, 有助于code!!!
a[0] 和 a[4]比 a[1] 和 a[5]比 。。。 a[4] 和 a[8]比, 比到最后一位 ,当交换次数不为 0 继续比较一轮
当交换次数为0 则 每隔 N-1 个数字比大小 同上
。。。 。。。 。。。
当 N = 1 时候 , 同上,当交换次数为0 ,排序完成
此时 N = 0 (跳出循环条件)
贴上代码:
#include<stdio.h>#define N 9void shell(int a[], int len){ int swapnum = 0; //记录交换次数 for(int gap = len/2; gap > 0; gap--) { while(1) { swapnum = 0; for(int i = gap; i < N; i++) { if(a[i-gap] > a[i]) { //交换 int temp = a[i]; a[i] = a[i-gap]; a[i-gap] = temp; swapnum++; } } printf("交换次数:%d\n", swapnum); if(swapnum == 0) { break; } } }}int main(){ int a[N] = {5,7,6,4,9,1,3,2,8}; int len = sizeof(a)/sizeof(int); shell(a,len); for(int i = 0; i < N; i++) { printf("%d ", a[i]); } return 0;}
阅读全文
0 0
- 由一道编程题学会希尔排序
- 每天一道编程题(六)-------希尔排序
- 每天一道编程题(三)------插入排序
- 每天一道编程题(四)--------冒泡排序
- 每天一道编程题(五)-------------选择排序
- 每天一道编程题(七)------------------快速排序
- 每天一道编程题(九)----------堆排序
- Java并发编程 希尔排序
- 由一道题看引用
- 由一道题了解Happens
- 【算法题】希尔排序
- 每日编程13之希尔排序
- 一道排序题
- 一道数组排序题
- 编程珠玑 第十一章 第 六题 选择排序和希尔排序
- 由中兴一道笔试题想到的
- 由一道题来看java初始化顺序
- 由一道Python题所想到的
- git 本地仓库和远程仓库及本地分支和远程分支
- IntelliJ IDEA快捷键(常用)
- C#“必须先将当前线程设置为单个线程单元(STA)模式方可进行OLE调用”异常解决方案
- Finding a Point on a Bézier Curve: De Casteljau's Algorithm
- No qualifying bean of type found for dependency: expected at least 1 bean which qualifies as autowir
- 由一道编程题学会希尔排序
- 解决Winform panel动态加载Form页面无法随着panel最大化的问题
- 登录注册 图片验证码生成
- 数据库的锁机制
- 电视盒子什么的都弱爆了,用树莓派做的这款才是真强大!
- 采用dlopen、dlsym、dlclose加载动态链接库
- bzoj 4821: [Sdoi2017]相关分析 线段树
- eclipse项目包层级显示方式调整
- 关于PHP数组重新索引问题