C语言实例解析精粹学习笔记——43(希尔排序)
实例说明:
用希尔排序方法对数组进行排序。由于书中更关注的实例,对于原理来说有一定的解释,但是对于第一次接触的人来说可能略微有些简略。自己在草稿纸上画了好久,后来发现网上有好多很漂亮的原理图。
下面将原书中的程序附上(主函数里的程序略有差异)
#include <stdio.h>
#include <stdlib.h> #define MAX 256
int R[MAX]; void ShellPass(int d, int n)
{
//希尔排序中的一趟排序,d为当前增量
int i,j;
for(i=d+; i<=n; i++) //将R[d+1...n]分别插入各组当前的有序区。
{
if(R[i] < R[i-d])
{
R[]=R[i]; j=i-d; //R[0]只是暂存单元,不是哨兵。
do{ //查找R[i]的插入位置
R[j+d] = R[j]; //后移记录
j = j-d; //查找前一记录
}while(j> && R[]<R[j]);
R[j+d] = R[]; //插入R[i]到正确的位置上
}
}
} void ShellSort(int n)
{
int increment = n; //增量初值
do{
increment = increment/ +; //求下一增量
ShellPass(increment, n);
}while(increment > );
} int main()
{
int n; printf("Please input total element number of the sequence:");
scanf("%d",&n); if(n > MAX)
{
printf("ERROR! There are too many elements!");
return ;
}
else if(n <= )
{
printf("ERROR!");
return ;
} printf("Please input the element one by one:\n");
for(int i=; i <= n; i++)
{
scanf("%d", &R[i]);
} printf("The sequence you input is :");
for(int i=; i<=n; i++)
printf("%4d", R[i]); ShellSort(n);
printf("\nThe sequence after shell sort is:");
for(int i=; i<=n; i++)
printf("%4d", R[i]); return ;
}
C语言实例解析精粹学习笔记——43(希尔排序)的更多相关文章
- C语言实例解析精粹学习笔记——18
<C语言实例解析精粹>中编译环境采用的是Turbo C 2.0.但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记. 实例18:将一个无符号整数转换为 ...
- C语言实例解析精粹学习笔记——35(报数游戏)
实例35: 设由n个人站成一圈,分别被编号1,2,3,4,……,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...
- C语言实例解析精粹学习笔记——42(插入排序)
实例说明: 将一个整数数组按从小到大的顺序进行排序.(主要学习基本的插入排序和改进的冒泡排序的算法和应用) 思路1: 从第一个数据开始,分别比较其后的数据,若比它小,则将这两个数的位置交换:从第一个数 ...
- C语言实例解析精粹学习笔记——36(模拟社会关系)
实例: 设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字.性别和指向父亲.母亲.配偶.子女的指针(只限两个子女).要求编写以下函数: (1)增加一个新人的函数 (2)建立人与人之间关系 ...
- C语言实例解析精粹学习笔记——32
实例32: 编制一个包含姓名.地址.邮编和电话的通讯录输入和输出函数. 思路解析: 1.用结构体来完成姓名.地址.邮编和电话的组合. 2.结构体指针的使用. 3.malloc的使用 4.scanf函数 ...
- C语言实例解析精粹学习笔记——31
实例31: 判断字符串是否是回文 思路解析: 引入两个指针变量(head和tail),开始时,两指针分别指向字符串的首末字符,当两指针所指字符相等时,两指针分别向后和向前移动一个字符位置,并继续比较, ...
- C语言实例解析精粹学习笔记——30
实例30: 用已知字符串s中的字符,生成由其中n个字符组成的所有字符排列.设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次.例如,对于s[]="abc",n=2, ...
- C语言实例解析精粹学习笔记——28
实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...
- C语言实例解析精粹学习笔记——26
实例26:阿拉伯数字转换为罗马数字,将一个整数n(1~9999)转换为罗马数字,其中数字和罗马数字的对应关系如下: 原书中的开发环境很老,我也没有花心思去研究.自己在codeblocks中进行开发的, ...
随机推荐
- how reset smartphone data.
question:how reset meizu smartphone solution one:hard step 1. power off your MEIZU smartphone. ste ...
- MSMQ学习笔记一——概述
一.MSMQ是什么 Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为M ...
- react-webpack-express
这是一个整合react express 实现前后台交互,并且采用webpack进行打包和解析文件.其实react官方有一个脚手架create react app,也可以看那个,但是这个脚手架webpa ...
- css渲染(三)颜色与背景
颜色的应用主要分为前景色.背景色和透明三个部分. 一.前景色 color color前景色 值: <color> | inherit 初始值: 用户代理特定的值 应用于: 所有元素 继承性 ...
- JQUERY实现点击INPUT使光标移动到最后或指定位置
下面本文章给大家简单介绍一下JQUERY实现点击INPUT使光标移动到最后或指定位置例子,希望对各位有帮助,你要知道面对一个 处女座的 需求者, focus()是远远不够的,比如说“我点进去的时候光标 ...
- 【[SCOI2015]情报传递】
非常无脑的板子题,就当是练一下板子 我们可以先将所有的操作离线下来,之后那些搜集过情报的点就有了点权,对于查询操作,就是查询一下这条路径上有几个点点权满足\(st<=now-C+1\) #inc ...
- 【[SDOI2013]随机数生成器】
题目 来画柿子吧 我们要求的是 \[f(x)\equiv t(mod\ \ p)\] 其中\(f(1)=x_0,f(x)=af(x-1)+b\) 我们来写几项柿子看看 \[f(1)=x_0\] \[f ...
- 【转】eclipse 错误信息 "File Search" has encounter a problem 解决
在eclipse中使用搜索功能,发生错误: "File Search" has encounter a problem 仔细看了一下自动跳出的错误日志(Error Log),发现: ...
- PHP设计模式——桥接模式
<?php /* * 桥接模式 * 使用发送器,将一个类对象传入另一个类作为属性,耦合M+N个类 * */ abstract class Info { protected $_send = NU ...
- javap(反汇编命令)
用法: javap <options> <classes> 其中, 可能的选项包括: -help --help -? 输出此用法消息 -version ...