原理:将元素逐个插入到前面已经排好序的子数组中
插入排序的一个重要性质是一旦找到了合适的位置,就可以提前终止内层循环,所以,对于近乎有序的数组,排序速度非常快
版本1:
#include <iostream>
using namespace std;
void insertionSort(int arr[],int n)
{
for(int i=1;i<n;i++) //为arr[i]找合适的位置
{
for(int j=i;j>0;j--) //从arr[0...i-1]中找
{
if(arr[j]<arr[j-1])
{
swap(arr[j],arr[j-1]);
}
else
break; //提前终止内层循环
}
}
return;
}
版本2:
void insertionSort(int arr[],int n)
{
for(int i=1;i<n;i++)
{
for(int j=i;j>0 && arr[j]<arr[j-1];j--)
{
swap(arr[j],arr[j-1]);
}
}
return ;
}
前面两个版本的交换操作过多,比较耗时,下面进行改进:
版本3:
void insertionSort(int arr[],int n)
{
for(int i=1;i<n;i++)
{
//寻找arr[i]应该插入的位置
int temp=arr[i];
int j=0; //j保存temp应该插入的位置
for(j=i;j>0 && temp<arr[j-1];j--)
{
arr[j]=arr[j-1];
}
arr[j]=temp;
}
return;
}