算法导论整理

1.算法基础
1.插入排序(Insertion-Sort)

for j=2 to A.length:
	key = A[j]
	//insert A[j] into the  sorted sequence A[1...j-1]
	i=j-1
	while i >0 and A[i]>key
		A[i+1] = A[i]
		i = i-1
	A[i+1]=key

原理:类似于扑克牌排序,左手上(已经排好序)的牌是A[1…j-1],右手上是要插入的牌A[j],剩下的是桌子上(待排序)的牌A[j+1…n]

证明:循环不变式(loop invariants):
初始化:首先证明循环之前成立。因为j=2,所以j-1=1。在循环开始前,A[1…j-1]
(就是A[1]),符合排序。
保持:需要证明如果某次迭代之前成立,则下次迭代也成立(例:j=8之前和当j=8)
终止:判断循环终止出现的性质证明成立。因为j=2,3,4…n,当n=n+1,循环终止,此时排好的A[1…n]里与原数组所有元素相同,且已经排好序,所以算法成立。

2.指针
表示一个数组或对象的变量—>指向数组或对象的数据的内存地址。(不是引用,引用是给内存地址起别名)
e.g: 设x的属性为f
当赋值y=x---->x.f =y.f—>因为x,y都指向了同一个对象。
指针不指向任何对象,则指针为NIL。

3.时间复杂度
插入排序
总运行时间: T(n)=1n+1(n-1)+1*(n-1)+(t2+…tn)+((t2-1)+…(tn-1))+((t2-1)+…(tn-1))+1*(n-1)
最佳情况:n
最坏情况:Theta n的平方

你可能感兴趣的:(数据结构)