标题:vb的排序问题
只看楼主
ymyan91
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-4-25
结帖率:0
已结贴  问题点数:20 回复次数:4 
vb的排序问题
对数组排序,记录数组原始下标,用冒泡法实现
搜索更多相关主题的帖子: 冒泡 
2013-04-25 18:29
zhengang1026
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:136
专家分:409
注 册:2013-2-6
得分:10 
什么意思?求代码?这种排序例题估计随便一本初级VB教材上都有。
2013-04-25 19:07
ymyan91
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-4-25
得分:0 
回复 2楼 zhengang1026
恩,数组排序我知道,主要是输出原始下标
2013-04-25 19:15
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:652
专家分:3402
注 册:2008-5-7
得分:10 
题意不清啊,输出原始下标是什么意思?有点费解。
最近做了几种排序的比较,对10000个正整数排序(未编译情况下):冒泡法6260ms,选择法2520ms,计数法13ms,快速排序法47ms。
由于计数法只能对正整数排序,且最大正整数还不能太大,所以不实用,排序还是用快速排序效果好。
快速排序的思想是:在排序系列中取一个数(可随机取),其他数与这个数比较,大于的在右边,小于的在左边,然后用递归方法对左边和右边再取数分治,最终左右位置相等时依次退出递归。代码如下:
private sub QuickSort(a() as integer,l as integer,r as integer)
  dim i as integer,j as integer,key as integer,t as integer
  if l<lbound(a) or r>ubound(a) then exit sub  '如果数组左右下标超出数组范围则退出
  key = a((l + r) \ 2)  '取数组中间数做key值
  i=l:j=r
  while i<=j
    while a(i)<key and i<r
      '此循环找到左边第一个大于key值的数
      i=i+1
    wend
    while a(j)>key and j>l
      '此循环从最右边找小于key值的数,这两个循环不要用for循环,虽然for循环也可达到目的,但每次都会重复从最左边和最右边计数,加大了排序时间
      j=j-1
    wend
    '经过上两个循环,i所在位置的数是大于key,而j所在位置的数小于key,两数交换即符合快速排序分治的要求
    if i<=j then
      'a(i)、a(j)两数通过中间变量t交换
      t=a(i):a(i)=a(j):a(j)=t
      i=i+1:j=j-1
    endif
  wend
  if l<j then quicksort a,l,j  '嵌套做左边快速排序
  if r>i then quicksort a,i,r  '嵌套做右边快速排序
end sub

[ 本帖最后由 lowxiong 于 2013-4-25 22:34 编辑 ]
2013-04-25 22:27
zhengang1026
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:136
专家分:409
注 册:2013-2-6
得分:0 
估计你是想在排序完成后输出时打上原排序标记。你可先输出原顺序,接着在下一行输出排序后顺序,这样不就行了吗?
或者先将原顺序用一数组存起来,排序后再比对输出。
2013-04-26 09:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-405514-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.385173 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved