排序算法之插入排序
/*
*参照新版程序
*/
//下面是错误的理解,正确的参考,后文已经修改过的部分。
//选择排序,顾名思义,就是选择一个元素进行排序。
原理:将原始序列分成两部分,一部分已经有序,一部分无序。将无序中的元素逐个插入到有序序列中。这个也是两层循环,就我个人理解,与冒泡排序是一个原理。冒泡排序是每次都从无序中选出一个最大或者最小的,插入排序则是将当年元素,与之前已经的有序的每个元素比较。相当于一个比较后半部分,一个比较前半部分。我们将冒泡排序的算法,稍作修改,就是插入排序。排序的本质还是一样的。
代码如下:
//插入排序算法
#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的批评与指正!