插入排序是一种简单的排序算法, Bentley[1]曾经实现过一个3行的C语言版本, 一个5行经优化后的版本。
插入排序算法分两种:一种是直接插入排序,一个是折半插入排序;
插入排序,顾名思义,就是每次将未排序序列L1中的一个元素插入到已经排好序的元素队列L2中,初始时,队列L2为空。
首先,有几个问题值得思考
(1).L1是未排序序列,每次选择L1中未排序的元素的方法是什么?
(2).L2代表已排序序列,起始时L2为空,那么此时L2如何初始化?
(3).当L2不为空时,如何将从L1中选择的元素插入到L2中使其仍然是已排序序列?
带着这三个问题,我们来学习经典插入排序的实现方式。
1.直接插入排序
图(1) 直接插入排序动态演示图,来源于Wikipedia
C++代码实现
#include<iostream>
using namespace std;
//print功能函数,用于打印每次遍历插入后的序列,总共需要N-1次
void print(int a[], int n, int i)//i表示第i次遍历
{
cout<<i<<":";
for(int j=0;j<n;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
void InsertSort(int a[], int n)
{
for(int i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
int j=i-1;
int x=a[i];
a[i]=a[i-1];
while(x<a[j]&&j>=0)//比较操作,将待插入元素和已排序序列元素依次进行比较
{
a[j+1]=a[j];//如果待插入元素小,则序列元素后移
j--;
}
a[j+1]=x;//找到插入位置,插入
}
print(a,n,i);
}
}
int main()
{
int a[7]={2,2,3,6,1,2,0};
InsertSort(a,7);
print(a,7,7);
}
结果:
Python代码实现:
参考文献
1.Bentley, Jon (2000). Programming Pearls. ACM Press/Addison–Wesley.
2.https://en.wikipedia.org/wiki/Insertion_sort
2.http://blog.youkuaiyun.com/hguisu/article/details/7776068