【算法】插入排序C语言实现

不知道大家喜不喜欢打扑克?哈哈,我就挺喜欢的,尤其是三人斗地主,很喜欢.现在我来描述一幅画面看看大家熟不熟悉.

我抓牌的习惯是,在抓牌的时候,我要看着我的牌,看看牌的状况,有没有大小鬼,有几个2,有没有长的连,顺便做好基本的排序工作.比如我第一张牌抓的是7,放在手里,第二张牌是J,我把它放在7的后面(对,我默认是左到右升序的的),第三张是10,我把它放在7和J之间,第四张牌还是10,那么我就有两个位置可以防止这个刚刚到来的10,一是把他放在J的前面,二是把它放在第一个10的前面也就是7的后面,这两种方法都是可取的(处女座还要比一下花色然后选择放置的位置,你伤不起啊),以此类推,直到抓完你所有该抓的牌,OK,叫地主,抢地主,开干.

卧槽这满满的画面感.

有的人此时就会问了,你不是要讲插入排序吗,怎么扯到了斗地主上去?对于这样的同学,我只能说这个问题问的很好.请容我跪着给你解开疑惑.

不知道大家有没有发现我们抓牌的时候就一直在做插入和比较(比较牌的大小)的操作,其实我们今天要讲的插入排序和抓牌的原理几乎是一模一样的,之所以先跟大家都一会儿地主,是为了帮大家预热一下,让大家能更好地理解代码的实现原理和之间的思想.

好了说了这么多,还是上代码吧:

void insert_sort(int array[], int length){
	int i;
	int j;

	int temp;	//在这里temp是作为哨兵,监视array[i]的值
	for(i=1; i<length; i++){
		if(array[i] < array[i - 1]){	//此时,array[i]之前的序列已经是有序状态
			temp = array[i];			//寄存array[i]的值
			for(j=i-1; array[j]>temp; j--){		//找到第一个不大于temp即array[i]的值,循环就结束
				array[j + 1] = array[j];		//将array[j]向后挪一个位置
			}
			array[j + 1] = temp;				//把哨兵存储的array[i]的数值填到最后剩下来的那个正确位置.
		}										//这样使得array[0]~array[i]为有序的
	}
}

看完代码及注释还是不懂的话,请冷静冷静.想象一下,我们在一个序列最开始的第一个元素算是一个序列吧,因为它只有一个元素,所以它一定是有序的.这样我们就拿他的下一个元素来和它进行组合,成为一个两个元素的序列,然后再比较它们的大小,如果后一个元素[之后称它为rear]比前一个元素[之后称它为front]小的话,那么就先把rear存到temp这个哨兵这里,然后front向后挪一位,覆盖原来的front,这时候我们没必要担心front的值会丢失,因为我们早就把rear的值存放在哨兵temp里了(现在看出了哨兵的作用了吧!),最后把哨兵的值再传给front.如此这般才能使他们组成一个有序的队列.之后就还是按照这个思想继续迭代比较交换挪位置,直到最后.

在直接插入排序里,哨兵的运用是很巧妙的,需要大家仔细揣摩,吸收这种思想,在你以后编写的程序中运用到那就是极好了.但是这不是说说就做到了,还需要靠你的代码量,共勉吧,感谢大家.谢谢.

时间: 2024-10-10 04:15:19

【算法】插入排序C语言实现的相关文章

排序算法总结(C语言版)

1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择排序 3.1     直接选择排序 3.2     堆排序 4.    归并排序 4.1     二路归并排序 4.2     自然合并排序 5.    分布排序 5.1     基数排序 1.插入排序 1.1      直接插入排序 将已排好序的部分num[0]~num[i]后的一个元素num[i+1]插入到之前已排好序的

深入排序算法的多语言实现

深入浅出排序算法的多语言实现 作者:白宁超 2015年10月8日20:08:11 摘要:十一假期于实验室无趣,逐研究起数据结构之排序.起初觉得就那么几种排序,两三天就搞定了,后来随着研究的深入,发觉里面有不少东西.本文介绍常用的排序算法,主要从以下几个方面:算法的介绍.算法思想.算法步骤.算法优缺点.算法实现.运行结果.算法优化等.最后对本文进行总结.本文为作者原创,程序经测试无误.部分资料引用论文和网络材料以及博客,后续参见参考文献.(本文原创,转载注明出处) 1 排序的基本概念 排序: 所谓

java算法插入排序优化代码

原文:java算法插入排序优化代码 代码下载地址:http://www.zuidaima.com/share/1550463280630784.htm 一个细节让插入排序更具效率 运行此方法需要为main方法传递参数 package com.zuidaima.sort; /** *@author www.zuidaima.com **/ public class TestSort { public static void main(String args[]){ int l = args.len

常用排序算法的C语言实现

最近看数据结构,把常用的排序算法用C语言写了一下. 没有按数据结构上的定义SqList结构体,只是用数组的形式实现. 有的算法并没有完全按书上给出的算法,但思路一致. #include<stdio.h> void InsertSort(int[], int); //直接插入排序 无哨兵 void BInsertSort(int[], int); //折半插入排序 void BubbleSort(int[], int); //起泡排序 void QSort(int[], int, int); /

【最全】经典排序算法(C语言)

本文章包括所有基本排序算法(和其中一些算法的改进算法): 直接插入排序.希尔排序.直接选择排序.堆排序.冒泡排序.快速排序.归并排序.基数排序. 算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首元素,并把它赋值给temp变量: 从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元素后移(实际上放置temp的元素位置已经空出) 直到

无限大整数相加算法的C语言源代码

忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里. 500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒. 下面是源码: #include <stdio.h> #include <stdlib.h> #include<string.h> #include <time.h> #define MAXNUM 1000000000000000000 /* 存储数据用的结构 long

Bagging算法的R语言实现

bagging 是bootstrap aggregating的缩写,是第一批用于多分类集成算法. bagging算法如下: 循环K次,每次都从样本集D中有放回地抽取样本集Di,这样总共得到k个样本集,用这K个样本集进行决策树生成,获得K个决策树模型,再将要检测的数据用这K个决策树模型进行多数表决,获得票数多的结论. 这种思想跟现代民主投票制度如出一辙,一个人再厉害,判断力也是有限的,但是把一群人聚合在一起投票,那单个人所犯错误的概率就会被抵消,最后得出结论的正确性会明显优于单个人做出决策. 个人

Kruskal算法的C语言实现(并查集版)

[问题] Kruskal算法求加权连通图的最小生成树的算法.kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中.注意到所选取的边若产生环路则不可能形成一棵生成树.kruskal算法分e 步,其中e 是网络中边的数目.按耗费递增的顺序来考虑这e 条边,每次考虑一条边.当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入. [代码] #include <stdio.h> #include

算法程序设计题语言类笔记

1. 求幂 #include<math.h> //头文件 pow(a,b); //a^b 2. bool #include<stdbool.h> //C中使用bool型需要加入头文件 3. 字符串操作相关 #include<string.h> //头文件 char a[20],b[20]; strcpy(a,b); //把字符串b拷贝到a中 length=strlen(); //求长度 strcmp(a,b); //字符串比较,将a和b中的字符逐个比较,相同继续比较下一

POS终端MAC算法-C语言实现

POS终端MAC算法-C语言实现