冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,因此而得名。课程采用固定数组演示,然后封装模块的方式,有利于加深理解,包含了文本的冒泡排序,双向冒泡排序,汇编的冒泡排序。
算法描述
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
计次循环+变量循环
.版本 2
.支持库 spec.局部变量 A, 整数型, , "5"
.局部变量 i, 整数型
.局部变量 k, 整数型
.局部变量 temp
A = { 6, 8, 5, 7, 4 }
.计次循环首 (4, i).变量循环首 (4, i, -1, k)' 调试输出 (A [k]).如果真 (A [k + 1] < A [k]) ' 如果前一个数比后一个数大temp = A [k] ' 把大的赋给临时变量tempA [k] = A [k + 1] ' 交换两个数组成员的值,此时A[k]一定是最小的数,A [k + 1] = temp .如果真结束.变量循环尾 ()
.计次循环尾 ()
调试输出 (A)
计次循环+计次循环
.版本 2
.支持库 spec.局部变量 a, 整数型, , "10"
.局部变量 n, 整数型
.局部变量 i, 整数型
.局部变量 t, 整数型' //冒泡排序,从小到大
a = { 89, 56, 34, 48, 57, 62, 74, 85, 93, 105 }
.变量循环首 (1, 10, 1, n).变量循环首 (1, 10 - n, 1, i).如果真 (a [i] < a [i + 1]) ' <从大到小,> 从小到大t = a [i]a [i] = a [i + 1]a [i + 1] = t.如果真结束.变量循环尾 ()
.变量循环尾 ()
调试输出 (a)
判断循环首 +变量循环首.版本 2
.支持库 spec.局部变量 比较次数
.局部变量 最后比较位置
.局部变量 n, 整数型
.局部变量 temp, 整数型
.局部变量 A, 整数型, , "0"A = { 6, 8, 5, 7, 4 }
比较次数 = 1
最后比较位置 = 取数组成员数 (A)
.判断循环首 (比较次数 > 0)比较次数 = 0.变量循环首 (1, 最后比较位置 - 1, 1, n).如果真 (A [n] > A [n + 1])temp = A [n]A [n] = A [n + 1] ' 这3行代码是交换用的。A [n + 1] = temp最后比较位置 = n比较次数 = 比较次数 + 1.如果真结束.变量循环尾 ()
.判断循环尾 ()
调试输出 (A)
判断循环首 +计次循环
.版本 2
.支持库 spec.局部变量 成员数, 整数型
.局部变量 x, 整数型
.局部变量 i, 整数型
.局部变量 temp
.局部变量 A, 整数型, , "0"A = { 6, 8, 5, 7, 4 }
成员数 = 取数组成员数 (A)
x = 1
.判断循环首 (x > 0) ' 开始进入冒泡过程x = 0 ' 初始化参数.计次循环首 (成员数, i) ' 循环判断开始.如果真 (成员数 = i) ' 设置跳出循环的条件跳出循环 ().如果真结束.如果真 (A [i] > A [i + 1]) ' 核心算法temp = A [i] ' 比较两个相邻数据A [i] = A [i + 1] ' 如果前大后小,那么互换A [i + 1] = temp ' 如果前小后大,那么不管了x = x + 1 ' 如果有执行互换,则参数变动' 要一直执行到不用互换为止.如果真结束.计次循环尾 ()
.判断循环尾 ()
调试输出 (A)
冒泡排序模块封装
.版本 2.子程序 冒泡算法
.参数 数据数组, 整数型, 数组
.局部变量 比较次数
.局部变量 最后比较位置
.局部变量 变量, 整数型
.局部变量 交换变量, 整数型比较次数 = 1
最后比较位置 = 取数组成员数 (数据数组)
.判断循环首 (比较次数 > 0)比较次数 = 0.变量循环首 (1, 最后比较位置 - 1, 1, 变量).如果真 (数据数组 [变量] > 数据数组 [变量 + 1])交换变量 = 数据数组 [变量]数据数组 [变量] = 数据数组 [变量 + 1] ' 这3行代码是交换用的。数据数组 [变量 + 1] = 交换变量最后比较位置 = 变量比较次数 = 比较次数 + 1.如果真结束.变量循环尾 ()
.判断循环尾 ()
冒泡排序优化.版本 2.子程序 冒泡法优化
.参数 参数组, 整数型, 数组
.局部变量 未比数据数量, 整数型
.局部变量 交换变量, 整数型
.局部变量 位置变量, 整数型
.局部变量 最后位置, 整数型未比数据数量 = 取数组成员数 (参数组)
.如果真 (未比数据数量 ≤ 0)返回 ()
.如果真结束
.判断循环首 (未比数据数量 > 0)最后位置 = 0.变量循环首 (1, 未比数据数量 - 1, 1, 位置变量).如果真 (参数组 [位置变量] > 参数组 [位置变量 + 1]) ' 前一个数大于后一个数,就将两数的位置交换交换变量 = 参数组 [位置变量] ' 数据组可以是变量、文件、数据库(这里用的是变量)参数组 [位置变量] = 参数组 [位置变量 + 1]参数组 [位置变量 + 1] = 交换变量 ' 以上3行代码是交换用的最后位置 = 位置变量.如果真结束.变量循环尾 ()未比数据数量 = 最后位置 ' 下一行排序从第一个数开始到上次排序的最后被改变的位数
.判断循环尾 ()
文本冒泡排序
.版本 2.子程序 文本冒泡排序
.参数 数据数组, 文本型, 数组
.参数 由小到大, 逻辑型, 可空
.局部变量 未比数据数量, 整数型
.局部变量 交换变量, 文本型
.局部变量 位置变量, 整数型
.局部变量 最后位置, 整数型
.局部变量 互换标记, 逻辑型未比数据数量 = 取数组成员数 (数据数组) ' 第一行排序比较所有数
.判断循环首 (未比数据数量 > 0)最后位置 = 0.变量循环首 (1, 未比数据数量 - 1, 1, 位置变量)互换标记 = 假.如果 (由小到大).如果真 (数据数组 [位置变量] > 数据数组 [位置变量 + 1])互换标记 = 真.如果真结束.否则.如果真 (数据数组 [位置变量] < 数据数组 [位置变量 + 1])互换标记 = 真.如果真结束.如果结束.如果真 (互换标记)交换变量 = 数据数组 [位置变量] ' 数据组可以是变量、文件、数据库(这里用的是变量)数据数组 [位置变量] = 数据数组 [位置变量 + 1]数据数组 [位置变量 + 1] = 交换变量 ' 以上3行代码是交换用的最后位置 = 位置变量.如果真结束.变量循环尾 ()未比数据数量 = 最后位置 ' 下一行排序从第一个数开始到上次排序的最后被改变的位数
.判断循环尾 ()
双向冒泡排序
.版本 2
.子程序 双向冒泡排序
.参数 参数组, 整数型, 数组
.局部变量 交换, 整数型
.局部变量 交换变量, 整数型
.局部变量 位置变量, 整数型
.局部变量 起始变量, 整数型
.局部变量 目标变量, 整数型
.局部变量 方向变量, 整数型目标变量 = 取数组成员数 (参数组) - 1
.如果真 (目标变量 ≤ 0)
返回 ()
.如果真结束
方向变量 = 1
起始变量 = 1
.判断循环首 (交换 = 0)
交换 = 1
.变量循环首 (起始变量, 目标变量, 方向变量, 位置变量)
.如果 (参数组 [位置变量] > 参数组 [位置变量 + 1])
交换变量 = 参数组 [位置变量]
参数组 [位置变量] = 参数组 [位置变量 + 1]
参数组 [位置变量 + 1] = 交换变量
交换变量 = 位置变量
交换 = 0
.否则
.如果结束
.变量循环尾 ()
方向变量 = 方向变量 × -1
交换变量 = 交换变量 + 方向变量
目标变量 = 起始变量
起始变量 = 交换变量
.判断循环尾 ()
汇编法冒泡排序
.版本 2.子程序 BubbleSort, 整数型,
.参数 array, 整数型, , 数组指针
.参数 len, 整数型, , 数组长度置入代码 ({ 131, 236, 12, 86, 131, 125, 12, 0, 117, 8, 139, 69, 8, 233, 130, 0, 0, 0, 199, 69, 252, 0, 0, 0, 0, 235, 9, 139, 69, 252, 131, 192, 1, 137, 69, 252, 139, 77, 252, 59, 77, 12, 125, 101, 199, 69, 248, 0, 0, 0, 0, 235, 9, 139, 85, 248, 131, 194, 1, 137, 85, 248, 139, 69, 12, 131, 232, 1, 43, 69, 252, 57, 69, 248, 125, 67, 139, 77, 248, 139, 85, 8, 139, 69, 248, 139, 117, 8, 139, 76, 138, 4, 59, 12, 134, 125, 44, 139, 85, 248, 139, 69, 8, 139, 76, 144, 4, 137, 77, 244, 139, 85, 248, 139, 69, 8, 139, 77, 248, 139, 117, 8, 139, 12, 142, 137, 76, 144, 4, 139, 85, 248, 139, 69, 8, 139, 77, 244, 137, 12, 144, 235, 166, 235, 138, 139, 69, 8, 94, 139, 229, 93, 194, 8, 0 })
返回 (0).版本 2
.支持库 spec.子程序 汇编冒泡排序
.参数 iarray, 整数型, 数组
.参数 retarray, 整数型, 参考 数组
.局部变量 len, 整数型
.局部变量 plr, 整数型
.局部变量 arrBuf, 字节集len = 取数组成员数 (iarray)
plr = BubbleSort (取变量数据地址 (iarray), len)
arrBuf = 指针到字节集 (plr, len × 4)
重定义数组 (retarray, 假, len)
RtlMoveMemory_arrn (retarray, arrBuf, len × 4)
源码:http://www.511yj.com/eyuyan-px-1.html