证明冒泡排序法的正确性

标签:
算法证明it |
本人的第一篇技术的博文,就发些简单点的东西吧~都是原创的,希望大牛们看到不要见笑哈~http://www/uc/myshow/blog/misc/gif/E___6725EN00SIGG.gif
首先,我们先用伪代码写出冒泡排序法
BUBBLESORT(A)
//
首先,我们先用伪代码写出冒泡排序法
BUBBLESORT(A)
1 for i<--1 to
length[A]
2 do for j<--length[A]downto i+1
3 do if A[j]<A[j-1]
4 then exchange A[j]<-->A[j-1]
///交换
我们先一步一步来:
首先看到2~4行,这是一个内循环。我们先假定i==1(外循环的第一轮迭代),以此来证明内循环的正确性。
内循环的思路是每次循环都要保持A[j]为A[j..n]的最小数。而其他则是保持不变
初始化:内循环第一轮迭代时,j==length[A],所以我们可以知道子数组A[j..n]只有一个数A[j](n就是length[A])。显然,在A[j..n]中,最小的数就是A[j]。
保持:内循环每一轮开始迭代之前,有A[j]是A[j..n]的最小数。而在每一轮迭代结束后由于
//
的作用,会使A[j]仍然是A[j..n]的最小数。这样就能保持了。
终止:当j==i时,循环就会终止了。由于3~4行是和前面一个元素进行比较并且交换的。所以,能保证A[i]为A[i..n]的最小元素
可能看到这里以后,大家会感觉不到内循环有什么用。就让我们结合外循环进行分析,得出它的作用吧!
外循环的思路是每次迭代开始前都会有A[1..i]是排序好的。
初始化:第一轮开始的时候,A[1..i]只有一个元素,显然是排序好了。
保持:(The
Point!!)每次开始迭代的时候,A[1..i]都是排序好的。而迭代时内循环将会使A[j..n]保持A[j]是最小的(大家注意到没A[j]就是A[i])。而A[j..n]每次给出的A[j]都不会小于前一次外循环得到的A[j]。故A[1..i]的性质得到了保持。(可能这样有点难以理解,不过常识下拿点简单的数试试就可以理解了)
终止:当i==n时,外循环结束。同时A[1..i](就是A[1..n])的性质得到保持(已排序的性质)。
至此~第一篇博文写完啦~~希望大家支持。下次有机会给大家介绍些web方面的。
前一篇:庆祝下博客的开通!