js实现插入排序:
let cards=[1,2,7,8,9,0,6,3,7];
//算法时间复杂度分析
let firstCard=cards[0]; //1
for(let i=1;i<cards.length;i++){ //2
let currentCard=cards[i]; //3
let j=i-1; //4
while(j>-1&&cards[j]>currentCard){ //5
cards[j+1]=cards[j]; //6
j--; //7
}
cards[j+1]=currentCard; //8
}
console.log(cards);
插入排序算法时间复杂度分析
设cards的长度为n
语句序号 消耗 执行次数
1 c1 1
2 c2 n
3 c3 n-1
4 c4 n-1
5 c5
6 c6
7 c7
8 c8 n-1
消耗的时间T(n)=c1+c2n+c3(n-1)+c4(n-1)+c5+c6
+c7
+c8(n-1)
当为最佳情况即cards为一个已排好顺序的数组,此时公式变为
T(n)=c1+c2n+c3(n-1)+c4(n-1)+c5(n-1)+c8(n-1)
即T(n)=an+b
当为最坏情况即cards为一个反序排列的数组,省去计算过程,此时公式变为
T(n)=a+bn+c
忽略掉次要情况,最佳情况变为n,最坏情况变为
一般情况下,我们更在意平均情况,这里最坏情况接近平均情况,也就是
我们用渐进符号Θ表示插入排序时间复杂度存在的集合
即Θ()
渐进符号Θ解释
Θ(g(n))相当于 存在两个常量c1和c2
我们需要的时间复杂度集合f(n)的范围为
c1g(n)<=f(n)<=c2g(n)
在插入排序中也就是c1<=f(n)<=c2
一般情况下我们只关注量级比如时间复杂度为Θ(n)的算法快于时间复杂度为Θ(
)的算法