排序算法-插入排序

排序算法之插入排序

/*

*参照新版程序

*/

//下面是错误的理解,正确的参考,后文已经修改过的部分。

//选择排序,顾名思义,就是选择一个元素进行排序。

原理:将原始序列分成两部分,一部分已经有序,一部分无序。将无序中的元素逐个插入到有序序列中。这个也是两层循环,就我个人理解,与冒泡排序是一个原理。冒泡排序是每次都从无序中选出一个最大或者最小的,插入排序则是将当年元素,与之前已经的有序的每个元素比较。相当于一个比较后半部分,一个比较前半部分。我们将冒泡排序的算法,稍作修改,就是插入排序。排序的本质还是一样的。

代码如下:

//插入排序算法
#include <iostream.h>
int val[9] = {10,23,21,18,7,2,56,28,21};
void show()
{
	int index;
	for(index = 0; index < 9; index++)
		cout<<val[index]<<"  ";
	cout<<endl;
}
void charu()
{
	int temp;
	for(int index1 = 0; index1 < 9; index1++)
	{
		for(int index2 = 0; index2 <= index1; index2++)
		{
			if(val[index1] < val[index2])
			{	
				temp = val[index1];
				val[index1] = val[index2];
				val[index2] = temp;
			}
		}
	}
}
void main()
{
	show();
	charu();
	show();
}

可以仔细比较与冒泡排序的算法,就会发现,几乎没有什么改动。


*******************************************************************************************************************

根据_Luffy和opassion两位高手的指点,下面给出修改后的代码,前面的代码,也就不删了,作为对比和警示。********************************************************************************************************************

所谓插入排序,必须要体现出来插入元素的操作。正如opassion所说,在没有找到所在位置的时候,需要一个一个的往后移动。直到找到该元素所在的位置,然后停止移动,拷贝元素到合适的位置。

下面是修改后的代码:

//插入排序算法
#include <iostream.h>
int val[9] = {10,23,21,18,7,2,56,28,21};
int temp;
void show()
{
	int index;
	for(index = 0; index < 9; index++)
		cout<<val[index]<<"  ";
	cout<<endl;
}
void charu()
{
	int temp;
	//第0个元素自动认为有序,下面从第1个到最后一个,逐个查找元素位置
	for(int index1 = 1; index1 < 9; index1++)
	{
		temp = val[index1];//记录当前元素值
		//逐个比较,当元素大于标杆值时,移动元素,否则,终止循环,将标杆元素拷贝到所在位置
		for(int index2 = index1 -1; index2 >= 0 ; index2--)
		{
			if(val[index2] > temp)
			{	
				val[index2+1] = val[index2];
			}
			else
				break;
		}
		//找到元素位置,将标杆值,拷贝进来,因为比较的是index2,所以,位置,应该是在index2之后的一个位置
		val[index2 + 1] = temp;
	}
}
void main()
{
	show();
	charu();
	show();
}
非常感谢 _Luffy和opassion的批评与指正!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值