排序算法之插入排序
1、插入排序的思想
插入排序是一个对少量元素进行排序的有效算法,其工作机理与很多人打牌时,整理自己手中牌时的做法差不多。开始我们手中没有牌,
牌面朝下的放在桌上。之后,我们一张一张的从桌上摸牌到手上,每当我们摸一张牌时都会将所摸之牌放到所摸牌中的正确位置,这时就要
将它与手中已有的牌从右至左地进行比较,因此无论什么时候,手中的牌都是排好序的,而这些牌原来都是桌面上的牌的最上面一张。
下面给出该算法的伪代码:
View Code
1 INSERTION-SORT(A) 2 for j <-- 2 to length[A] 3 do key <-- A[j] 4 i <-- j - 1 5 while i > 0 and A[i] > key 6 do A[i + 1] <-- A[i] 7 i <-- i - 1 8 A[i + 1] <-- key
2、插入排序算法的分析
插入排序过程的时间开销与输入有关,还有,即使排序两个相同长度的输入序列,所需的时间也可能不同。这取决于他们已排序的程度。
一般来说,算法所需时间是与输入规模同步增长的,因而常常将一个程序的运行时间表示为其输入的函数。
算法的运行时间是指在特定输入时,所执行的基本操作数(或步数)。目前,先假设,每执行一行伪代码都要花一定量的时间。虽然每
一行所花的时间可能不同,但我们假定执行第i行所花的时间都是常量ci。
首先给出该算法每一条指令的执行时间及执行次数。对j=2,3,...,n,n=length[A],设tj为第5行中while循环所做的测试次数。当
for或while循环以通常方式退出时,测试要比循环体多执行一次。
由伪代码我们可以得出每一行所执行的次数为:n,n-1,n-1,n-1,Σtj(j=[2,n]),Σ(tj - 1)(j=[2,n]),Σ(tj - 1)(j=[2,n]),n-1.由此我们可以读出该算法的总的运行时间为c2n+...+c8(n-1)。
如果输入的数组已经是排好序的话,就会出现最佳情况。对j=2,3...,n中的每一个值,我们发现,在第5行中,当i取其初始值j-1时,
都有A[i]<key。于是,对j=2,3,...,n,有tj=1,则最佳的运行时间为:(c2+c3+c4+c5+c8)n-(c3+c4+c5+c8)。
其可以表示为an+b,因此,它是n的一个线性函数。


浙公网安备 33010602011771号