首页 > 代码库 > 插入排序

插入排序

插入排序
对数组进行排序时。第一个元素不变。
从第二个元素开始检查当前元素是否大于上一个元素。大于就交换
一直交换至不大于的情况
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]);
}
但是实际上速度还比选择要慢,我们需要优化
//插入排序版本1,性能略差
void insertSort1(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]);
}
}
}
//插入排序版本2,性能强多了
void insertSort2(int * arr,int n)
{
for(int i=1;i<n;i++)
{
int data=http://www.mamicode.com/arr[i];
int j=i;
for(;j>0&&arr[j-1]>data;--j)
arr[j]=arr[j-1];
arr[j]=data;
}
}
 
 
以上的选择和插入都是输入n^2的算法
n^2复杂度的算法和nlogn复杂度的算法对比起来根据n的差异,耗时差距非常大。
当n为100000时,效率对比相差了6000倍
 
但是插入排序在面对近乎为有序的列表排序时,效率有时比nlogn更好
 
根据插入排序继续延伸到后面变成了另一种排序SHELL 排序(希尔排序)
 
nlogn复杂度的算法基本为很好的。归并排序就是属于nlogn级别的
 
归并排序实际就是将列表分为一半,然后一直分一半。直到都分为单独的一个成员时
然后开始向上归并,再归并的过程中再排序。当归并回最上层时,就排序好了
归并排序同样也可以进行优化,对近乎有序的列表处理更加快速

插入排序