排序算法之 直接插入排序及时间复杂度分析

直接插入排序

直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。
因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成:

  1. 第一层循环:遍历待比较的所有数组元素
  2. 第二层循环:将本轮选择的元素与前面已经排好序的元素相比较,若当前元素小,则进行交换
    在这里插入图片描述
算法实现
int i,j,insertVal;
for(i=1;i<n;i++){
	insertVal=arr[i];          //insertVal为准备插入的数
	j=i-1;                   //插入的数与有序序列最后一个进行比较
	while(j>=0&&insertVal<arr[j]){
           arr[j+1]=arr[j];       
			j--;
	}
	arr[j+1]=insertVal;    
}
时间复杂度分析

从空间上看,它只需要一个记录的辅助空间,因此关键看时间复杂度。
当最好情况,也就是排序表本身就是有序的,则只需要进行n-1次比较,由于每次都是arr[i] > arr[i+1],没移动记录,时间复杂度为O(n).
最坏的情况下,是排序表逆序,需要比较 (n+2)(n-1)/2次,移动(n+4)(n-1)/2次。如果排序记录是随机的,根据概率相同的原则,平均比较和移动的次数约为n^2/4次。
因此,直接插入排序算法时间复杂度为O(n^2),比冒泡排序和简单选择排序算法性能好一些。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值