寻找第f小数的证明

来源:互联网 发布:淘宝网假冒材质成分 编辑:程序博客网 时间:2024/06/05 02:53

在数列A[1...N] 中查找第f小的数

算法如下:

1任意选定一个数r(比如说A[f]),然后将A[m...n]分成两部分:

A[m],...A[k],A[k+1],...A[n]

并满足 A[m],...,A[k]<=r A[k+1],A[n]>=r

2如果 f属于[m,k],另n=k

3如果f属于[k+1,n],另m=k+1

4如果 m=n=k,终止

次算法将A[1,N]分成三部分

A[1,m-1]<=A[m,n]<=A[n+1,N]

步骤一:问题定义

*前条件:给定数列A[1...N],和1<=f<=N

*后条件:移动A使得A满足

对于任意p,q(1<=p<=f<=q<=N 可推出A[p]<=A[f]<=A[q]) (Found)

步骤二:寻找中间变量(不变量)

*定义中间变量m和n,满足A[m]是中间部分第一个元素,A[n]是中间部分最后一个元素

*不变量的目的:

m<=f且对于任意p,q(1<=p<m<=q<=N 可推出 A[p]<=A[q]) (m-inv)

f<=n 且对于任意p,q(1<=p<=n<q<=N 可推出  A[p]<=A[q])  (n-inv)

*决定m和n的初始值:

m=1,n=N

*检查初始值是否满足不变量

*定义递增情况:

while m<n do "减小中间部分“

*该循环能否完成目标任务:循环终止时:

m-inv且n-inv且(m<n不成立)

可推出 m==n==且对于任意p,q(1<=p<=f<=q<=N 可推出 A[p]<=A[f]<=A[q])  结论成立

        *得到程序结构:



0 0
原创粉丝点击