插入排序

插入排序
对数组进行排序时。第一个元素不变。
从第二个元素开始检查当前元素是否大于上一个元素。大于就交换
一直交换至不大于的情况
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=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级别的
 
归并排序实际就是将列表分为一半,然后一直分一半。直到都分为单独的一个成员时
然后开始向上归并,再归并的过程中再排序。当归并回最上层时,就排序好了
归并排序同样也可以进行优化,对近乎有序的列表处理更加快速

转载于:https://www.cnblogs.com/kings0/p/6418686.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值