[Visual Basic]几种常考的排序算法代码模板
Posted lsqwq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Visual Basic]几种常考的排序算法代码模板相关的知识,希望对你有一定的参考价值。
冒泡排序
注意点
- 越界问题:i的边界是n-1,也就是说是对总共的第1~n个数进行排列(最后一个数处于被比较状态,不需要额外主动比较);j的初始值或最终值与当前i的值
有关题目中往往会改变i的值来考察,拿j的值来填空 - 升降序问题:取决于j循环与if比较
- 循环次数:n-1 两两比较次数:n(n-1)/2
初级代码
For i=1 to n-1
For j= n to i+1 step -1
If d(j)<d(j-1) then
t=d(j): d(j)=d(j-1):d(j-1)=t
End If
Next j
Next i
变式
遍数优化
原理:先立一个flag,如果当前这遍循环中有进行过交换,则改变flag的值;如果一直没有进行交换,即数列已有序,则退出循环
For i=1 to n-1
flag=true 'new
For j= n to i+1 step -1
If d(j)<d(j-1) then
t=d(j): d(j)=d(j-1):d(j-1)=t
flag=false 'new
End If
Next j
if flag=true then Exit For 'new
Next i
范围优化
原理:基于遍数优化版本上的再次优化(遍数优化当然可以修改成do while形式的)。last用于锁定最近且最后一次修改的地方,flag效果同遍数优化。下一次循环只需要遍历last~n之间的数字即可。
Do while flag=true 'new
last=1:flag=true 'new
For j= n to last+1 step -1
If d(j)<d(j-1) then
t=d(j): d(j)=d(j-1):d(j-1)=t
m=j 'new
flag=false 'new
End If
Next j
last=m'new
Loop
双向排序
原理:说白了就是一个升序一个降序的俩普通冒泡并在一起,但是一个从头一个从尾开始遍历。由于内部的for是并列的,所以粗略地看,时间复杂度并没有变化,但却将比较遍数缩小成其1/2。个人觉得只适用于n为偶数的情况,
因为如果像下面的代码一样,中间必有一个孤儿没有排到。(visual basic中的/是向下取整)
For i=1 to n/2
For j= n-i+1 to i+1 step -1
If d(j)<d(j-1) then
t=d(j):d(j)=d(j-1):d(j-1)=t
End If
Next j
For j= i+1 to n-i step -1
If d(j)<d(j+1) then
t=d(j):d(j)=d(j-1):d(j-1)=t
End If
Next j
Next i
单层循环
原理:
Do While i <= n
If i=0 or a(i-1)<=a(i) Then
i=i+1
Else i<>0 And a(i-1)>a(i)'感觉这个else简直废话
t=a(i-1):a(i-1)=a(i):a(i)=t
i=i-1
End If
Loop
以上是关于[Visual Basic]几种常考的排序算法代码模板的主要内容,如果未能解决你的问题,请参考以下文章