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

  • 排序算法之 冒泡排序及性能优化(时间复杂度+空间复杂度分析)
  • 排序算法之 简单选择排序及时间复杂度分析

直接插入排序

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

  1. 第一层循环:遍历待比较的所有数组元素
  2. 第二层循环:将本轮选择的元素与前面已经排好序的元素相比较,若当前元素小,则进行交换
    排序算法之 直接插入排序及时间复杂度分析_第1张图片

算法实现

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),比冒泡排序和简单选择排序算法性能好一些。

你可能感兴趣的:(数据结构排序算法)