C语言::简单排序之插入排序

版权声明:本文由 高小调 创作,转载请带链接,侵权必究! https://blog.csdn.net/gaoben668/article/details/51605240

(写这篇文章的目的是为了帮助我的兄弟们了解究竟什么样的博文才是高质量的博文。什么?你觉得我写的很烂?那你在下面留言喷我啊!!!)

插入排序.....我先假设你不会插入排序,因此先从算法讲起。我知道在这么多读者中,一定会有读者抬杠说,我会插入排序算法。好吧,那我就假设你会插入排序算法,但是不会写代码;可能还有一小部分读者会继续抬杠说,我会插入排序算法,我也会写代码。那就请你按下键盘上Ctrl+F4,有惊喜哦!

        一、插入排序之算法

插入排序就是取出一个数字,将它插入对应的位置。这么说就太无聊了,于是乎下面我举例说明:
首先假设有这样一组数字:5 8 4 3 6 7 2 0。我们给它标号(1,2,3,4...8)
插入排序是怎么实现让它们成为一个有序序列的呢?//正序
第1步,将第1个数字(5)取出来,因为它是第一个,所以原封不动的放在它原来的位置上。//此时的序列为 5 8 4 3 6 7 2 0
第2步,将第2个数字(8)取出来,和(5)进行比较,明显8>5,因为要排列成正序,符合我们需要的顺序,因此8也原封不动的放在原来的位置.
// 5 8 4 3 6 7 2 0
第3步,将第3个数字(4)取出来,和(8)进行比较,明显4<8,所以将4放在8的前面;然后4与5进行比较,明显4<5,因此将4放在首位.
// 4 5 8 3 6 7 2 0
第4步,将第4个数字(3)取出来,和(8)比较,和(5)比较,和(4)比较,最终放在首位。
// 3 4 5 8 6 7 2 0
第5步,将第5个数字(6)取出来,和(8)比较,最终放在(8)的前面。
// 3 4 5 6 8 7 2 0
第6步,将第6个数字(7)取出来,和(8)比较,最终放在(8)的前面。
// 3 4 5 6 7 8 2 0
第7步,将第7个数字(2)取出来,和(8)比较、和(7)比较....最终放在首位。
// 2 3 4 5 6 7 8 0
第8步,将第8个数字(0)取出来,和(8)比较、和(7)比较、和(6)比较....最终放在首位。
// 0 2 3 4 5 6 7 8  
至此,排序完成!

二、插入排序用C语言实现

从一中我们可以看出,有8个数,就需要8步。N个数呢?因此,至少得循环N次。这个N来源于排序序列的长度。
你以为这样就完了嘛?如果你觉得是,那你就太天真了。
除了每次取数需要循环之外,在数与数之间比较也是需要循环的!
我相信聪明的人可能已经懂了!当然不排除有些读者的思维习惯比较深入,反应较慢,所以我再详细解释一下另一个循环:
从第4步,我们就可以看出,当3和8比较时,3得插入8的前面。然后3的前面是5,3和5继续进行比较,3得插入5前面,然后3的前面是4......最终将3插入首位。
持续比较的过程,难道不觉得应该用循环来做更方面一些嘛?
因此,我们首先确定了,要写出这个插入排序算法,得需要两个循环!
接下来我们确定,这两个循环之间的关系,循环与循环的关系无非两种:顺序和嵌套。
顺序的意思是,循环A做完之后做循环B;嵌套的意思是做执行循环A的时候,会执行循环B。
从上一步中的例子中,明显可以看到这两个循环的关系是嵌套关系。
因此,我们再次确定了,两个循环之间的是嵌套关系!
接下来我们确定循环的条件外层循环正如前面所提到的需要N次,但实际上N-1次足矣!
而内层循环次数,根据序列不同,它次数不同。因此,我习惯用while循环。那么内层循环条件是什么?
在本次正序排列中,我们发现,只要被取出来的数字小于它前面的数字就插到它前面,因此内层循环的条件是当前取出的数字小于它前面的数字。
因此,我们又确定了,两个循环的条件:外层:循环N次;内层:当前取出数字小于它前面的数字;
最终实现代码如下:
#include<stdio.h>     
void InsertSort(int *a,int n); //插入排序 
void Print(int *a,int n);		//输出数组 
int main(){ 
	int a[] = {5,6,7,2,3,1,4,8,9,0};
	Print(a,10);		//输出源数组 
	InsertSort(a,10);	//进行插入排序 
	Print(a,10);		//输出排序后的数组 
}

void InsertSort (int *a,int n){
	int i = 1;		//外层循环变量 
	int pos = 0;	//前一个数字的位置 
	int tem = 0;	//被取出的当前数字 
	for(;i<n;i++)
	{
		pos = i - 1;	//始终指向当前位置的前一位置 
		tem = a[i]; 	//当前被取出来的数 
		while((pos>=0) && (tem<a[pos]))
		{
			a[pos+1] = a[pos];	//持续覆盖当前位置数字 
			pos--;
		}
		a[pos+1]=tem;		//将取出数字插入合适位置 
	}
	
}

void Print(int *a,int n){
	int i;
	for(i=0;i<n;i++)
	{	
		printf("%d ",a[i]);
	}	
	printf("\n");
}
相信有了上面我辛辛苦苦的讲解,理解插入排序的代码应该不难吧!
单单理解还不够, 还不快去自己动手打一遍!!!
如果有不知道printf函数是干啥的读者,那就参考:C语言::printf()函数功能、原型、用法及一些有趣的实例
最后,祝大家每天能开心的学到知识,身体健康!

猜你喜欢

转载自blog.csdn.net/gaoben668/article/details/51605240
今日推荐