☆算法集锦☆
vb吧
全部回复
仅看楼主
level 5
笑如咖啡 楼主
大家都把自己知道的或者看过的一些算法发出来吧。。资源共享
2007年05月13日 00点05分 1
level 5
笑如咖啡 楼主
【选择排序】的思想是依次从待排序数列中选择最大(小)的、第二大(小)的等等,然后依次重新排列为有序数列。以某个关键字(key)选一个最大(小)的元素出来,可以看成是一场比赛,就像拳击比赛,如果你能从第一局打到最后一局,那你就是最强者,我们选出这个最强者的过程就是选择的过程,选出来之后,将它标记,然后再从剩下的选手中以同样的方法(分治)选出第二强的,依次下去,直到只剩一个选手(边界)为止。这就是选择排序的全部思想方法。①直接打擂的方式:(直接选择排序法)直接选择排序法的算法是这样的,首先选出前n个元素中的最小(大)者,如果这个最小(大)者不是第1个元素,则与第1个元素交换,然后以同样的方法对付后n-1个元素(分治),直到处理的元素只剩一个,即得到有序序列。它和冒泡排序法很类似,不同的是冒泡排序法进行了更多次的交换,而有些交换是不必要的,这使得冒泡排序法是不稳定的,而直接选择排序法是稳定的排序法。②锦标赛的方法:(树型选择法)玩过拳皇游戏的人就知道这种比赛方法,实际中的比赛可以不必要打这么多次,我们可以把n个选手分成n/2组,假定n=8,先分成4组,每组两人,两个人打一局,这样可以产生4个胜者,再将这4个人分2组,每组同样两人,各自再打一局,这样可以产生2个胜者,同样再做一次就能产生冠军。这样做的好处是强者可以只打几场就能坐上冠军的宝座,不像前一种方法,冠军要跟其它的人都打一场才能确定(当然,这是最糟的情况)。但是树型选择法最大的缺点是需要的存储空间要大,要建一个败者树,对n很大的情况不太理想。③堆排序:将前一种方法进一步改进,使得在O(1)的空间复杂度上就能完成的选择排序法,就是大名鼎鼎的“堆排序法”。堆是一个线性表,下标从1开始取,且满足:nk>=max{n2k,n2k+1}或者nk<=min{n2k,n2k+1},前者称为大顶堆,后者称为小顶堆。这样看似乎不太明白,我们把堆转换成完全二叉树,它的特点就相当显然了。【完全二叉树】是这样一棵二叉树,我们以堆中的元素,从头取,先取1个,做为根,再取2个,做为它的左右子结点,再取4个做为下一层的子结点,依次下去就构成完全二叉树。它的前n-1层(n是它的总层数,称为深度)是一棵满二叉树(即所有非子叶的结点的的度都为2,饱满的意思),第n层的结点靠左对齐。这样就可以简单的得到结点之间的关系,设结点的序号为k,那它的左孩子序号为2k,右孩子序号为2k+1,这样一来,堆就对应这样一棵完全二叉树:它的根结点大于(小于)左右子树中所有元素,并且左右子树也有这样的性质。那么堆排序的关键问题就是“如何建堆?”因为从堆的特点看出,它的根结点就是“冠军”,可以直接选择,但是选取之后如何再构建堆?一开始又如何建堆呢?【算法】是这样实现的:因为n/2之后的结点已经是堆,只要从这点开始向前调节,将它与它的左右孩子中最大(小)的比较,如果比它还大(小)则不用往后移,这点即是它的位置,否则将它和那个孩子子交换,依次下去,直到这个结点确定了位置,然后再向前调整,直到根部。
2007年05月13日 00点05分 2
楼主懂选择排序法和冒泡排序法吗,我读的中职高考会考这俩,程序填空题,楼主可以教教我吗有题不难但是不会
2017年07月22日 11点07分
level 13
【CBM666 的随机数小考验】 '100 个学生,座号 1-100, 由老师随机抽座号, 抽到座号的同学离开教室.看看你怎么抽 ?? '******************************************************For i = 1 To 100 Randomize num = Rnd * (100 - i + 1) + i x = arr(i) arr(i) = arr(num) arr(num) = x Next i '----------咖啡归来 作者: 219.144.174.* 2007-5-12 10:06   回复此发言 '******************************************************Private Sub Command1_Click() Dim i As Long, num As Long, x As Long, arr(1 To 100) As Long For i = 1 To 100 arr(i) = i Next '7F的代码---------------------------- For i = 1 To 100 Randomize num = Int(Rnd * (100 - i + 1)) + i x = arr(i) arr(i) = arr(num) arr(num) = x Next '----------------------------------- For i = 1 To 100 Me.Print Format(arr(i), "@@@@@"); If i Mod 10 = 0 Then Me.Print Next End Sub 作者: 珊瑚水岸 2007-5-12 16:39   回复此发言
2007年05月13日 00点05分 4
这个应该是将1至100进行了100次两两随机调换,生成一个随机表,然后按顺序读这个表。那么能不能一次只生成一个随机数,下一次生成的随机数排除之前的生成的数?
2017年07月27日 12点07分
@WANG091926 想了下,我说的这个要求太没效率了,尤其是到后期,生成的随机数有很大概率与之前的随机数重复,那么程序就会一直不断的生成随机数,直至与之前的不同。
2017年07月28日 09点07分
用chr函数从1至100生成一个len为100的字符串,然后先生成一个100内的随机数,用replace函数从字符串中按顺序取走改位置的元素,并用asc函数将这个元素转为数字赋予数组,然后依次用该方法随机99,98…1内的数,最终生成一个数组
2017年10月09日 02点10分
level 5
笑如咖啡 楼主
cbm666老师谢谢加精了哈希望大家都把一些好的算法共享。。。
2007年05月13日 00点05分 5
level 2
学习!!谢谢!
2007年05月13日 02点05分 6
level 1
3楼的不是vb把。。。感觉像C...
2007年05月13日 03点05分 7
你觉得呢
2014年08月19日 07点08分
level 5
笑如咖啡 楼主
三楼的确实不是VB但是这个应该关系不大。。。在例子里面只有数组是[]可以改成()就OK了其他都没有太多的不一样。。。语言都是相通的
2007年05月13日 05点05分 8
level 5
笑如咖啡 楼主
算法 Algorithm算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。一个算法应该具有以下五个重要的特征: 有穷性: 一个算法必须保证执行有限步之后结束; 确切性: 算法的每一步骤必须有确切的定义; 输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件; 输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
2007年05月13日 07点05分 9
level 6
7_seven,我感觉3楼的应该是C++,呵呵
2007年05月13日 10点05分 11
level 2
就是标准c
2007年05月13日 14点05分 12
level 1
顶了
2007年05月17日 06点05分 13
level 5
笑如咖啡 楼主
判断两个串是否“相等”,两个串里面的字符顺序不一定相同,还是举个例子吧,假如两个串是"hello"和"elloh"或者"lleoh"则认为它们相等,这个算法怎么写 Private Function isEqual(str1$,str2$) End Function isEqual("abc","bca")返回True isEqual("abc","acb")也返回True 回复:求一算法 '大小写不一样会判断为不同,除非你另外再处理. Dim aa$, bb$, i%, suma%, sumb% Private Sub Form_Load() aa = "hello": bb = "lolhe" suma = 0: sumb = 0 For i = 1 To Len(aa) suma = suma + Asc(Mid(aa, i, 1)) sumb = sumb + Asc(Mid(bb, i, 1)) Next i If suma = sumb Then MsgBox "相同字串" Else MsgBox "不同字串" End If End Sub 贴子相关图片: 作者: cbm666 2007-5-17 10:41   回复此发言
2007年05月18日 04点05分 14
level 5
笑如咖啡 楼主
楼上的问题。。。。回复:求一算法 '楼主在 14F 的代码, 看起来应该算是最好的了.(字符串处理的效率不说) '补充完 14F 的代码 Dim aa$, bb$, i% Private Sub Form_Load() aa = "hello": bb = "olhle" MsgBox isEqual(aa, bb) End Sub Private Function isEqual(str1 As String, str2 As String) As Boolean If Len(str1) <> Len(str2) Then '长度不等直接退出 isEqual = False Exit Function End If For i = 1 To Len(str1) '逐个删除串2中相同的 str2 = Replace(str2, Mid(str1, i, 1), "", , 1) Next isEqual = IIf(str2 = "", True, False) End Function 贴子相关图片: 作者: cbm666 2007-5-18 09:42   回复此发言
2007年05月18日 04点05分 15
level 7
这题可以用哈希表处理的……
2007年05月18日 04点05分 16
level 5
笑如咖啡 楼主
楼上的可以把你的程序发出来吗?用哈希表处理的
2007年05月18日 04点05分 17
level 7
分析:在C或PASCAL中的长哈希要用指针来实现(类似VB中的动态声明),但在VB里,我认为用集合操作比较方便。其实就是统计每个单字出现的次数(因为考虑到中文的ASCII码比较大,所以要动态声明,否则用固定数组A(1 To 256)就够了)。给出伪代码(需要懂得哈希链表的数据结构):function pd(s1 as string, s2 as string) as boolean{create two arrays a1, a2 (0..50000) for hash tablefor i = 1 to len(s1){k=asc(mid(s1,i,1))k=k mod 50000 '计算哈希码,可以在这里对它进行优化,进一步提高速度添加到哈希链表a1(k)中}类似处理s2最后比较a1、a2两个哈希表是否相同}
2007年05月18日 05点05分 18
level 7
哈希链表数据结构:a1(1 To Max)中每一个元素有三个成员变量:ch、data与next,分别表示字符ch及其出现次数data与其下一个元素(在这里用到了指针),由于Max只有50000,可能出现重复的哈希码如asc码为0与50000按上述计算就得到相同哈希码,因此hash表存储的仅仅是得到该哈希码的字符的第一个元素,其后所有哈希码相同的元素都顺序地由next变量指向,这就是哈希链表存储结构。具体方案如怎么优化哈希码计算使得hash表排列尽量稀疏可参看《算法导论》。
2007年05月18日 05点05分 19
level 6
好贴
2007年06月06日 02点06分 20
level 6
收藏了
2007年06月06日 02点06分 21
level 5
初学:看了一个简单程序(C的),这也许算不上什么算法吧,但我觉得有趣,把它换成Vbscript吧:'《算经》中的一个问题:'一只公鸡值五文钱,一只母鸡值三文钱,三只小鸡值一文钱,'现在用100文钱买100只鸡,问公鸡、母鸡、小鸡各有几只?a=0b=0c=0msg=""for a = 0 to 20 for b = 0 to 33c = 100 - a - bif 100=5*a
+3
*b+c/3 then msg = msg + "公鸡、母鸡、小鸡: " & a & " " & b & " " & c & vblfend if nextnextmsgbox msg,,"百钱百鸡"'请大家多多指点。QQ384797451
2007年06月27日 07点06分 22
1 2 尾页