插入排序

插入排序的核心思想是将一个待排序的元素插入到有序表中的合适位置,使之继续保持有序,然后重复上述步骤最终完成排序。这里类似于抓扑克牌,每次抓一张牌我们都会将其插入到合适的位置,使手上的牌一直保持有序。对数组使用插入排序算法,就是从数组第二个元素开始从后往前进行相邻元素判断比较,通过交换位置寻求合适的插入位置。

public static void chaRu(int[] arr){
    for(int i=1;i<arr.length;i++){//这里视第一个元素为有序的,所以只需要对角标为1到n-1的元素进行插入即可
        //这里判断arr[j]是否比前一个元素arr[j-1]小,如果arr[j]较小则此时需要查到arr[j-1]元素前,在数组中就是交换位置,这里j>0是保证arr[j-1]元素角标不越界
        for(int j=i;j>0 && arr[j]<arr[j-1];j--){//这个判断条件其实可以写到for循环体中,但这并没有利用数组中已经有序的前端,所以这只会增加无谓的比较
            int temp=arr[j];
            arr[j]=arr[j-1];
            arr[j-1]=temp;
        }
    }
}        

这里分析其时间复杂度,在最好情况即数组有序时,只需要n-1次比较和0次移动,其时间复杂度为O(n),在最差情况即数组逆序时,需要1+2+...+n-1=n(n-1)/2次比较和等次数的移动,其时间复杂度为O(n^2)。从平均意义上来说,时间复杂度为O(n^2),且插入排序的比较和移动次数也约为n(n-1)/4次,而选择排序的比较次数恒为n(n-1)/2次,所以总体上来说,插入排序的性能是略优于选择排序和冒泡排序的,所以在简单排序算法中,插入排序是性能最为优异的。插入排序空间性能是O(1),也为稳定排序。


接下来介绍复杂排序算法,首先就是希尔排序


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值