C语言实例解析精粹学习笔记——42(插入排序)
实例说明:
将一个整数数组按从小到大的顺序进行排序。(主要学习基本的插入排序和改进的冒泡排序的算法和应用)
思路1:
从第一个数据开始,分别比较其后的数据,若比它小,则将这两个数的位置交换;从第一个数据开始,直到最后。
#include <stdio.h>
#include <stdlib.h>
#define MAX 100 int main()
{
int TotNumEle;
int R[MAX];
int temp; printf("Please input the number you will input:");
scanf("%d", &TotNumEle); if(TotNumEle > MAX)
{
printf("Sorry, there are too many elements");
return ;
} printf("Please input the elements one by one:");
printf("\n");
for(int i=; i < TotNumEle; i++)
{
scanf("%d", &R[i]);
} for(int i=; i<TotNumEle-; i++)
{
for(int j=i+; j<TotNumEle; j++) //要注意起始标号,刚开始的时候我就搞错了
{
if(R[i] > R[j])
{
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
} printf("The sequence after sort is :\n");
for(int i=; i<TotNumEle; i++)
{
printf("%4d", R[i]);
} printf("\n");
return ;
}
下面是原书中给出的示例:
采用直接插入排序
1. 基本思路:假设待排序的记录存放在数组R[1..n]中(R[0]不存储待排序的原始数据)。初始时,R[1]自成一个有序区,无须区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[i..i-1]中,生成含n个记录的有序区。
插入排序与打扑克时整理手上的纸牌类似,第一张牌不需要整理,之后的逐张排序。
int R[MAX]; void Insert_Sort(int n)
{
int i,j;
for(i=; i<=n; i++)
{
if(R[i] < R[i-])
{
R[] = R[i]; j = i-; //R[0]有点temp的感觉
do{
R[j+] = R[j];
j--;
}while(R[] < R[j]);
R[j+] = R[];
}
}
}
以上为关键代码
归纳注释(原书内容):
哨兵的作用:算法中引进的附加记录R[0]称监视哨或哨兵(Sentinel)。哨兵有两个作用:
1)进行查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容;
2)它的主要作用是在循环中“监视”下标变量j是否越界。一旦越界(即j=0),因为R[0]和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界。
C语言实例解析精粹学习笔记——42(插入排序)的更多相关文章
- C语言实例解析精粹学习笔记——18
<C语言实例解析精粹>中编译环境采用的是Turbo C 2.0.但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记. 实例18:将一个无符号整数转换为 ...
- C语言实例解析精粹学习笔记——35(报数游戏)
实例35: 设由n个人站成一圈,分别被编号1,2,3,4,……,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从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语言实例解析精粹学习笔记——19
实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和倒着看相同的数). 主要思路: 一种方法:将正整数n数转换成d进制的数,逐个比较首尾对应数字,判断是否为回文数. 另一种方法:将正整数n数转 ...
- C语言实例解析精粹学习笔记——43(希尔排序)
实例说明: 用希尔排序方法对数组进行排序.由于书中更关注的实例,对于原理来说有一定的解释,但是对于第一次接触的人来说可能略微有些简略.自己在草稿纸上画了好久,后来发现网上有好多很漂亮的原理图. 下面将 ...
随机推荐
- 【NLP_Stanford课堂】最小编辑距离
一.什么是最小编辑距离 最小编辑距离:是用以衡量两个字符串之间的相似度,是两个字符串之间的最小操作数,即从一个字符转换成另一个字符所需要的操作数,包括插入.删除和置换. 每个操作数的cost: 每个操 ...
- SQL Server 2012安装配置(Part2 )
2 服务器安装 运行安装程序后,首先进入 SQL Server 安装中心.选择左侧导航树中的"安装"菜单项. 图2-1 SQL Server 安装中心 在右侧菜单中点击" ...
- Selenium2学习(十五)-- 单选框和复选框(radiobox、checkbox)
本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...
- Linux下实现普通用户免密登录并执行root权限
需求:服务器的root和密码登录都禁用,只开放普通用户登录,这时需要给普通用户配置秘钥文件,实现无密码登录 需要注意的是使用什么用户,就把秘钥文件拷入到该用户的家目录下,如果是root用户,就直接拷贝 ...
- react-webpack-express
这是一个整合react express 实现前后台交互,并且采用webpack进行打包和解析文件.其实react官方有一个脚手架create react app,也可以看那个,但是这个脚手架webpa ...
- [EffectiveC++]item31:将文件间的编译依存关系降至最低
P143:“声明的依赖性"替换“定义的依存性”
- Git warning push.default is unset
warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple ...
- python接口测试-项目实践(四)拼接出预期结果
四 字符串拼接 空值处理 当某字段接口数据为空,则不显示相关字串. 比如字串原本是 "...,净资产收益率:ROE%",当接口数据中ROE为空,不显示',净资产收益率:%' 三目运 ...
- Django:Django的路由系统
一,URLconf配置 1,基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 2 ...
- UVA1184 Air Raid
嘟嘟嘟 最小路径覆盖板子题. 建二分图,然后跑Dinic(因为我不会匈牙利),然后ans = n - maxflow(). 主要是发一下用链前存图的写法.(好像比vector短一点) #include ...