典型的比较排序算法:插入排序、堆排序、快速排序。
根据算法导论中出现的先后顺序,首先出场的是插入排序
一.原版插入排序伪代码:
1. for j=2 to A.length
//A.length 为数组A的长度
2. for i= j-1 downto 1
3. if A[i]>A[i+1]
4. exchange A[i] with A[i+1] //比较,若不符合递增,则交换
5. i=i-1
6. else break
#include<iostream>
using namespace std;
void insertsort1(int * ival,int length);
void insertsort2(int * ival,int length);
int main()
{
int a[]={ 5,2,6,1,3};
int Alength=5;
for(int i=0;i!=5;++i)
{
cout<<a[i]<<'\t';
}
cout<<endl;
insertsort1(a,Alength);
for(int i=0;i!=5;++i)
{
cout<<a[i]<<'\t';
}
cout<<endl;
return 0;
}
void insertsort1(int *ival,int length)
{
for (int j=1;j!=length;++j)
{
for (int i=j-1;i!=-1;--i)
{
if (ival[i]>ival[i+1])
{
int temp=ival[i];
ival[i]=ival[i+1];
ival[i+1]=temp;
}
else
{
break;
}
}
}
}
void insertsort2(int *ival,int length)
{
for (int j=1;j!=length;++j)
{ int key=ival[j];
int i=j-1;
for (;i!=-1;--i)
{
if (ival[i]>key)
{
ival[i+1]=ival[i];
}
else
{
break;
}
}
ival[i+1]=key;
}
}
算法改进1: C++中实现两个数组元素的交换需要三条代码:temp=A[i];A[i]=A[i+1];A[i+1]=temp;通过下列算法交换代码只需一条指令实现。上述程序当中函数insertsort2是一条指令实现交换。
INSERTION-SORT(A)
1. for j=2 to A.length //A.length 为数组A的长度
2. key=A[j]
3. for i= j-1 downto 1
4. if A[i]>key
5. A[i+1]=A[i]
6. i=i-1
7. else break
8. A[i+1]=key
算法分析:插入排序法的最坏情况时间为Θ(n^2)插入排序适合原来顺序就已经很好的序列。如算法导论7.2-4习题所描述的银行支票兑付问题。