算法入门之二(插入排序)

插入排序应该算是比较好理解的一种了,原理类似于我们打牌的时候,摸牌插入手中的情景。来看一下图,立刻就明白了:

我们将一个数组int a[12] 看做一副扑克牌,假设数组有12个数,那么扑克牌也一共有十二张,放在一起开始;

我们先抽一张拿到手上,这时候,我们不需要排序,因为不论哪一张先被我们抽上来,不论大小都只有一张,我们不妨将这张牌定为a[0]

然后我们再抽一张(a[1]),假设我们打牌的习惯是牌抽上来的牌从小到大排列,左边的牌最小,右边的牌最大(即数组从小到大排序),那我们我们抽上来的第二张牌,先要跟抽上来的第一张牌(已经拿在手上的这张)进行大小比较,如果小于第一张牌(a[0]),那么就应该放在a[0]的左边;如果大于第一张牌(a[0]),那么就应该放在a[0]右边;如果两张牌相等,怎么放都行。

然后我们再抽第三张牌(a[2]),这时我们就需要遍历一下手上已经拿到且排好序的两张牌,看看有没有一张牌比a[2]大,如果有,a[2]就要插入到这个比它大的位置,如果没有,那么a[2]就放在最右边即可;如果要插入,在插入之前,要把后面的牌依次先往后移动一位,给a[2]腾出一个位子,这样a[2]再插入其中。

之后每摸一张牌,都需要进行一次这样的遍历,将摸到的新牌插入到最合适的位置,直到最后一张牌插入完毕,手上的牌也就按从小到大的顺序排列好了,相应的我们的数组也就已经排序完毕。

按照这样的思想,我们能比较容易的写出插入排序的代码:

#include <iostream>

//数组长度
#define MAX_SIZE 12

//数组最大下标
#define MAX_INDEX MAX_SIZE-1

typedef int T;

using namespace std;

//申明插入排序函数
void insertSort(T* a);

//申明打印数组的函数
void printArr(T a[]);

int main() {

	//待排序的数组
	int a[MAX_SIZE] = { 8, 5, -1, 99, 14, 17, 14, 63, 14, 75, -1023, 0 };

	printArr(a);

	insertSort(a);

	printArr(a);

	return 0;
}

/*
 * 打印数组函数
 */
void printArr(T a[]) {
	for (int i = 0; i < MAX_SIZE; i++) {
		cout << a[i] << ' ';
	}
	cout << endl;
}

/*
 * 插入排序函数
 */

void insertSort(T* a) {
	int i, j, k, tmp;

	//外圈的循环,每一次循环都是新抽出的一张牌,所以从1开始到MAX_INDEX结束,因为最开始0那一张牌应该是拿在手上的
	for (i = 1; i <= MAX_INDEX; i++) {

		for (j = 0; j < i; j++) {//已经到手的牌的遍历过程,找到需要的位置
			//从小到大排序
			if (a[j] > a[i]) {
				break;
			}
		}
		//拿到的这个a[j],是序列里面第一个大于a[i]的数,也可能不存在,那么这时j应该==i
		if (j < i) {
			//先临时保存a[i],以免被移动复制的时候覆盖掉值
			tmp = a[i];

			//做依次后移工作,应该是要从j到i-1都要依次后移一位
			for (k = i - 1; k >= j; k--) {
				a[k + 1] = a[k];
			}
			//真正将a[i]的原值插入j位置
			a[j] = tmp;
		}
	}

}
时间: 2024-11-25 17:55:11

算法入门之二(插入排序)的相关文章

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

若干排序算法简单汇总(二)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/36706131 作者:小马 一希尔排序 上一篇讲到的直接插入排序,时间复杂度O(n^2). 请在脑海里想一下它的过程.如果一个序列本来就是有序的,对它排序的时间复杂度是O(n).所以当序列基本有序时,插入排序排序的效率大大提高,因为减少了移动的动作. 另外,直接插入排序还有一个特点,当n比较小时,它的效率比较高. 希尔排序正是基于上面两个思想做的一种改进算法.它先将整个序列分成若干

C语言快速入门教程(二)

C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要:  单词  +  语法!  将单词按照一定的语法拼凑起来就成了一个英语句子了; C语言同样是这样,只不过单词可以理解为一些固定的知识点,而语法可以理解为算法(可以理解为解决问题的方法) 在这一节中我们就对固定知识点中的语言描述与数据存储进行解析! 1.C语言的基本元素 1.1  标识符 什么是标识符? 答:在C语言中,符号常量,变量,数组,函数等都需

让算法会说话之插入排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/26059615 插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 一.插入排序算法 /*************************************************************** *版权所有 (C)2014,公司名称. * *文件名称:插入排序法 *内容摘要:无 *其它说明:无 *当前版

SVM算法入门

转自:http://blog.csdn.net/yangliuy/article/details/7316496SVM入门(一)至(三)Refresh 按:之前的文章重新汇编一下,修改了一些错误和不当的说法,一起复习,然后继续SVM之旅. (一)SVM的简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中[10]. 支持向量机方法

贝叶斯公式由浅入深大讲解—AI基础算法入门

1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定的值.比如如果问那时的人们一个问题:"有一个袋子,里面装着若干个白球和黑球,请问从袋子中取得白球的概率是多少?"他们会想都不用想,会立马告诉你,取出白球的概率就是1/2,要么取到白球,要么取不到白球,即θ只能有一个值,而且不论你取了多少次,取得白球的概率θ始终都是1/2,即不随观察结果X

区块链快速入门(二)——分布式系统核心技术

区块链快速入门(二)--分布式系统核心技术 一.分布式系统的一致性问题 1.分布式系统的一致性问题 随着摩尔定律碰到瓶颈,越来越多情况下要依靠可扩展的分布式架构来实现海量处理能力.单点结构演变到分布式结构,首要解决的问题就是数据的一致性.如果分布式集群中多个节点不能保证处理结果的一致性,建立在其上的业务系统将无法正常工作.区块链系统是一个典型的分布式系统,在设计上必然也要考虑一致性问题.在面向大规模复杂任务场景时,单点的服务往往难以解决可扩展(Scalability)和容错(Fault-tole

算法之排序二

算法之排序二 四.冒泡排序与插入排序       为何在实际中倾向于使用插入排序而不是冒泡排序,尽管它们的时间复杂度都是O(n2),而且也都是稳定的.看一下两个算法在交换元素数值的处理上就知道了.对于冒泡排序,交换两个元素时需要引入中间变量,也就是如果需要交换 A 和 B,我们需要让 A 赋值给 C,然后让 A 等于 B,再让 B 等于 C.而插入排序在每次比较时会把大的元素往后移,要插入的时候直接插入,所以更加的直接,在实际应用时更常用.在 Python 上测试一下也可以知道,冒泡排序比插入排

第一部分:趣味算法入门;第八题:冒泡排序(并与选择排序对比)

100个不同类型的python语言趣味编程题 在求解的过程中培养编程兴趣,拓展编程思维,提高编程能力. 第一部分:趣味算法入门:第八题: 8.冒泡排序:对N个整数(数据由键盘输入)进行升序排序 冒泡排序的思想:首先从表头开始往后扫描数组,在扫描的过程中逐对比较相邻的俩个元素的大小.若相邻的两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去了一个逆序,在扫描的过程中不断的将两相邻元素中的大者往后移动,最后就将数组中的最大者换到了表的最后,然后在剩下的数组元素中(n-1)个元素重复上面的