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(希尔排序)
实例说明: 用希尔排序方法对数组进行排序.由于书中更关注的实例,对于原理来说有一定的解释,但是对于第一次接触的人来说可能略微有些简略.自己在草稿纸上画了好久,后来发现网上有好多很漂亮的原理图. 下面将 ...
随机推荐
- siebel学习笔记-应用/数据访问控制
应用/数据访问控制Siebel提供的两种主要的访问控制方式在View级别和Data(record)级别: 1.View级别的访问控制:一个企业通常按照功能进行工作的区分,分配给一个用户的功能决定了他能 ...
- 【量产工具修复】U盘插上没反应,格式化提示有写保护
最近在实验室发现师兄留下的U盘,插上电脑后打不开,弹出格式化界面,格式化的时候又提示该u盘“被写保护无法格式化”,于是打算采用量产的方法. 第一步:使用chipgenius监测u盘的芯片制造商和型号 ...
- vue v-on:事件
1.js代码 var box=new Vue({ el:'.box', data:{ msg:'hello' }, methods:{ /*方法放置区,函数*/ show:function(){ // ...
- expdp指定时间戳导出防止数据不一致
expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME=“TO_TIMESTAMP(’25-08-2004 14:35:00’,’ ...
- python入门3 python变量,id(),is运算符
python变量无需声明数据类型,可以直接赋值使用. 比如: num=100 #整数 str="字符串" #字符串 turple1 =('mon','tue','wed','thu ...
- 初识prufer序列
前言 \(prufer\)序列应该是一个比较实用的东西. 据\(hl666\)大佬说,一切与度数有关的树上计数问题,都可以用它以及它的性质来解决. 而听说\(ZJOI\)最近特别喜欢出计数题,所以有必 ...
- Codeforces Round #333 (Div. 1)
A. The Two Routes In Absurdistan, there are n towns (numbered 1 through n) and m bidirectional railw ...
- 设置IE浏览器的默认下载路径
实现效果: 知识运用: Default Download Directory键 实现代码: private void button2_Click(object sender, EventArgs e) ...
- 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...
- PAML学习一
前言 模式识别起源于工程,而机器学习从计算机科学中产生.然而这两者被看做同一领域的两方面,过去十年里他们获得了极大的发展.特别是,贝叶斯方法已经发展成主流,而图模型已经被融入用于描述和应用概率模型的通 ...