插入排序的思想是
增量法,它每一次都将一个待排序的元素插入到已经排序好的局部列表(数组)中。我们在玩牌时,就用到了插入排序。插入排序算法的伪代码如下:
测试程序如下:
输出的结果如下:
InsertionSort( A )
for i<-2 to A.length do
key <- A[ i ]
j <- i - 1
while j>0 and A[ j ] > key do
A[ j+1 ] = A[ j ]
i <- i - 1
A[ j+1 ] = key
算法用C++实现如下:
void InsertionSort(int a[],int length)
{
for(int i=1;i<length;i++)
{
int key = a[i];
int j = i-1;
while( (j>=0)&&(a[j]>key) )
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
函数中的两个参数,第一个是数组的名字,第二个是数组的长度。实现的是对整型数组排序,当然也可以采用C++中的函数模板,使其可以对任何类型都可以排序。如下:
template <class elemType> void InsertionSort(elemType a[],int length)
{
for(int i=1;i<length;i++)
{
elemType key = a[i];
int j = i-1;
while( (j>=0)&&(a[j]>key) )
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
测试程序如下:
#include <iostream>
#include <string>
using namespace std;
template <class elemType> void InsertionSort(elemType a[],int length)
{
for(int i=1;i<length;i++)
{
elemType key = a[i];
int j = i-1;
while( (j>=0)&&(a[j]>key) )
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
int main()
{
int a[10] = {10,9,8,7,6,5,4,3,2,1};
string b[10] = {"ten","nine","eight","seven","six","five","four","three","two","one"};
InsertionSort(a,10);
InsertionSort(b,10);
for(int loop=0;loop<10;loop++)
{
cout<<a[loop]<<endl;
}
for(int loop=0;loop<10;loop++)
{
cout<<b[loop]<<endl;
}
return 0;
}
输出的结果如下:
插入排序的时间消耗为O(n^2)。