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(希尔排序)
实例说明: 用希尔排序方法对数组进行排序.由于书中更关注的实例,对于原理来说有一定的解释,但是对于第一次接触的人来说可能略微有些简略.自己在草稿纸上画了好久,后来发现网上有好多很漂亮的原理图. 下面将 ...
随机推荐
- 在centos7中安装redis,并通过node.js操作redis
引言 最近在学习node.js 连接redis的模块,所以尝试了一下在虚拟机中安装cent OS7,并安装redis,并使用node.js 操作redis.所以顺便做个笔记. 如有不对的地方,欢迎大家 ...
- matlab中换行
若在命令窗口中,如果一条语句已经写完,需要换行,可以用"Shift+Enter", 如果一条语句没写完就想换行,可以使用"...+Enter".
- 西门子 1500 1200 PLC,位访问, 字节访问
访问byte,word中的位 mybyte.%X1 myword.%X1 访问word/dword中的byte myword.%B0 myword.%B1 myDword.%B0 文中mybyte, ...
- Mrach 9 2017 Week 10 Thursday
There is a kind of beauty in imperfection. 有一种美叫做不完美. Every thing, every one, in the world, is not p ...
- http中COOKIE和SESSION有什么区别?(转知乎)
作者:知乎用户链接:https://www.zhihu.com/question/19786827/answer/28752144来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- 【转】Dalvik虚拟机的启动过程分析
在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的.Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程 ...
- Visual Studio IDE环境下利用模板创建和手动配置CUDA项目教程
目前版本的cuda是很方便的,它的一个安装里面包括了Toolkit`SDK`document`Nsight等等,而不用你自己去挨个安装,这样也避免了版本的不同步问题. 1 cuda5.5的下载地址,官 ...
- 【luogu P2194 HXY烧情侣】 题解
题目链接:https://www.luogu.org/problemnew/show/P2194 第一问:缩点并且统计其强连通分量里的最小耗费.把所有强连通分量的最小耗费加起来. 第二问:统计在每个强 ...
- 【luogu P1306 斐波那契公约数】 题解
题目链接:https://www.luogu.org/problemnew/show/P1306#sub gcd(f[m],f[n]) = f[gcd(m,n)] #include <iostr ...
- Storm处理流程, 基本参数配置
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAksAAAG/CAYAAABIVpOQAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF