引言
插入排序就是将一个序列中第一个元素,认为是有序数组,该数组含一个元素,剩下的元素构成一个无序数组,将无序数组中元素逐一与有序数组中最后一个元素开始向前比较,根据具体的从大到小的顺序或者从小到大的顺序,若元素需按从小到大的顺序排列,则当无序数组中的元素小于有序组数中元素时,将有序数组该元素往后移动一位,无序数组中该元素赋值到该有序数组的位置上,按此方法有序数组中元素的值再增加,无序数组中元素的值减少。
如例:3,1,6,2按从小到大排序。实现插入排序时,将第一个元素3作为有序数组,其余元素1,6,2作为无序数组,用无序数组中的第一个元素1与有序数组中的最后一个元素3比较,1<3,将3后移一位,1放到3原来的位置上,有序数组变为1,3,无序数组为6,2,将无序数组中的元素6与有序数组从最后一位开始向前比较,6>3,不用移动位置,由于按照从小到大的顺序排列,此时不需再与有序数组中元素向前比较,此时有序数组:1,3,6,无序数组只有一个元素2,将无序数组中元素2与有序数组1,3,6从最后一位向前比较,遇到比2小的元素,则停止本轮比较,2<6,将6向后移动一位,2赋值给6之前所在的位置,用2与3比较,2<3,将3往后移动一位,将2赋值给3之前所在的位置,接着用2与1比较,2>1,不需要做任何操作,此时无序数组已经逐一比较结束,有序数组为,1,2,3,6。
示例
基于vs2010的控制台应用程序,下面是代码:
insertSort.cpp
// insertSort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
/************************************************************************/
/* 功能:插入排序 (从小到大) 2,5,3,6,1
功能函数:
void insertSort(int *parr,int n) 插入排序
void printParr(int *parr,int n) 输出数组元素*/
/************************************************************************/
void insertSort(int *parr,int n)
{
for(int i = 1; i< n; ++i)
{
int temp = parr[i];//采用中间变量temp,否则会覆盖
for( int j = i-1;j >= 0; --j)
{
if(temp < parr[j])
{
parr[j +1] = parr[j];//后移
parr[j] = temp;
}
else
{
break;
}
}
}
}
void printParr(int *parr,int n)
{
for(int i = 0; i < n; ++i)
{
cout<<parr[i]<<"\t";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = {2,5,3,6,1};
printParr(arr,5);
cout<<endl;
insertSort(arr,5);
printParr(arr,5);
cout<<endl;
system("pause");
return 0;
}
程序的结构如下: