插入法排序有个例子讲的形象,比如玩扑克牌,插入排序可以用打牌时对摸起的牌根据牌的点数来对其进行插入排列来描述。可以把左手中的牌比做已经摸起的牌,即已经被排列好的牌,左手可以容纳的牌数的空间可以假想为和要摸的牌的总数相同;而在桌子上的那部分没摸的牌则是未被排序的牌,这二者的关系可以抽象为数组中已经被排序好的部分和未被排序好的部分。一开始摸起的第一张牌不需要排序,可以认定其为已排序的牌。然后摸第二张牌的时候,会和手里面的牌进行比较,如果比一张牌大,那就放在第二张牌位置,如果比第一张牌小,就放到第一张牌前面,然后摸第三张牌,同样,先和第二张牌进行比较,如果比二张牌大就将第三张牌放到第三牌位置,如果第三张比第二张牌小,就将第三张牌放在第二张牌的位置,第二张牌就放在第三张牌的位置,然后再去和第一张牌比较,如果比第一张牌大就确认放在第二张牌的位置,如果还比第一张牌小就放到第第一张牌的位置,然后本来第一张牌就放在第二张牌的位置,后面的步骤和前面的一样
具体代码如下所示:
#include <iostream>
using namespace std;
void print(int *a, int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void select_order(int *a, int n)
{
int tmp = 0;//辅助变量
for (int i = 1; i < n; i++)//首元素已经排好,从第一元素开始往里面插
{
int k = i;
tmp = a[i];//将准备插入的元素取出来
for (int j = i - 1; (j >= 0) && (tmp < a[j]); j--)
{
a[j + 1] = a[j];//发现取出来的元素值比前面排序后的值小,则需要将排序好的值往后移,一直移到小于取出来的值
k=j; //k为需要插入的位置
}
a[k] = tmp;//元素插入
print(a, n);
}
print(a, n);
}
void main()
{
int a[] = { 1,5,2,4,3,7,6,9,0,8 };
int n = sizeof(a) / sizeof(*a);
select_order(a, n);
cout << "hello world";
system("pause");
return;
}
运行结果如下图所示: