每次考虑一个数据项,将其插入排好序的适当位置,然后将所有其他项右移,直到排序完成;
插入排序对于已经排好序,且文件比较大的数据排序速度要好于选择排序;
最简单直接的插入排序程序
template <class Item>
void sort(Item a[], int left, int right)
{
int i, j;
for(i=left+1; i<=right; i++)
for(j=i; j>left; j--)
If(a[j] < a[j-1]) exch(a[j-1], a[j]);
}
从第二个元素开始,每次比较当前元素与前一个元素,小则交换,直至第一个元素。
- 改进算法:因为左边是排好序的,因此,如果元素不比左边的元素小,则停止内部循环,而对于元素交换,应该尽量高效,避免使用中间变量
template <class Item>
void sort(Item a[], int left, int right)
{
int i, j;
Item t;
for(i=left+1; i<=right; i++)
{
t = a[i];
j = i;
while(a[j-1]>t && j>left)
//当插入到头部后,j=0,对于C和C++,此句不出错,因为其不检测下标越界,而且后半句为假,因此顺利退出循环,但其他语言不行,如VB等,a[j-1]会有下标越界异常
{
a[j] = a[j-1];
j--;
}
a[j] = t;
}
}
template <class Item>
void sort2(Item a[], int left, int right)
{
int i,j;
Item t;
for(i=right; i>left; i--)
{
if(a[i]<a[i-1]) exch(a[i],a[i-1]);
}
for(i=left+2; i<=right; i++)
{
t = a[i];
j = i;
while(a[j-1] > t)
{
a[j] = a[j-1];
j--;
}
a[j] = t;
}
}