对n个数排序输出(得不到正确结果,不知道哪错了)

Gangelwn 2008-12-11 08:57:35
Module Module1

Sub Main()
Dim i, j, n, tmp, exchange As Integer
Dim a() As Integer
Console.Write("请输入n:")
n = Console.ReadLine()
ReDim a(n)
Console.WriteLine("请输入" & n & "个数:")
For i = 1 To n
a(i) = Console.Read()
Next
For i = 1 To n - 1
exchange = 0
For j = n To i + 1
If a(j) > a(j - 1) Then
tmp = a(j)
a(j) = a(j - 1)
a(j - 1) = tmp
exchange = 1
End If
Next

If exchange = 0 Then
Continue For
End If

Next
Console.WriteLine("输出排序后的数:")
For i = 1 To n
Console.Write(a(i) & Space(1))

Next
Console.ReadKey()
End Sub

End Module

我是用冒泡算法排序的。。。但执行结果却不正确
不知道哪里错了,,请大家帮我看下,谢谢!!!
...全文
106 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gangelwn 2008-12-16
  • 打赏
  • 举报
回复
Module Module1

Sub Main()
Dim i, j, n, tmp, exchange As Integer
Dim a() As Integer
Console.Write("请输入n:")
n = Console.ReadLine()
ReDim a(n)
Console.WriteLine("请输入" & n & "个数:")
For i = 1 To n
a(i) = Console.ReadLine()

Next
For i = 1 To n - 1
exchange = 0
For j = n To i + 1 Step -1
If a(j) > a(j - 1) Then
tmp = a(j)
a(j) = a(j - 1)
a(j - 1) = tmp
exchange = 1
End If
Next

If exchange = 0 Then
Continue For
End If

Next
Console.WriteLine("输出排序后的数:")
For i = 1 To n
Console.Write(a(i) & Space(1))

Next
Console.ReadLine()

End Sub

End Module

在调试窗口输入数值时每输入一个数后必需换行
要不然得不到结果。。。由于把数值输入在一行中所以得不到结果
因为这条语句吧 a(i) = Console.ReadLine()
不知道可以用哪条输入语句,可以使得这样输入,例:12 15 16 11 而不用每次输入一个数换行
chndnk 2008-12-13
  • 打赏
  • 举报
回复
路过一起学习了
bw555 2008-12-12
  • 打赏
  • 举报
回复
第二层循环
改为
For j = n To i + 1 Step -1

For j = i + 1 to n
wenh7788 2008-12-12
  • 打赏
  • 举报
回复
我觉得你的那个第二层循环
带代码是不是应该
从1 to n-i
就是排好序的(也就是大的数字都沉到下面去了)就不需要比较了
wenh7788 2008-12-12
  • 打赏
  • 举报
回复
冒泡排序没有这么复杂吧
混分的
哈哈
特别 2008-12-12
  • 打赏
  • 举报
回复

Module Module1

Sub Main()

Dim i, j, n, tmp, exchange As Integer
Dim a() As Integer
Console.Write("请输入n:")
n = Console.ReadLine()
ReDim a(n)
Console.WriteLine("请输入" & n & "个数:")
For i = 1 To n
a(i) = Console.ReadLine() '这里不能使用Read
Next
For i = 1 To n - 1
exchange = 0
For j = n To i + 1 Step -1 '从大到小循环时,需要设置步长,默认为1,则永远不会进行循环
If a(j) > a(j - 1) Then
tmp = a(j)
a(j) = a(j - 1)
a(j - 1) = tmp
exchange = 1
End If
Next

If exchange = 0 Then
Continue For
End If

Next
Console.WriteLine("输出排序后的数:")
For i = 1 To n
Console.Write(a(i) & Space(1))

Next
Console.ReadKey()


End Sub

End Module
boluor1987 2008-12-12
  • 打赏
  • 举报
回复

Sub BubbleSort(ByVal Arr() As Integer, ByVal Length As Integer)
'冒泡排序
Dim i As Long, j As Long, tmp As Long
For i = 0 To Length - 2
For j = 0 To Length - i - 2
If Arr(j) > Arr(j + 1) Then
tmp = Arr(j)
Arr(j) = Arr(j + 1)
Arr(j + 1) = tmp
End If
Next
Next
End Sub


假设定义了一个数组 : Dim Arr1(MAX) as Integer
调用时用 : BubbleSort(Arr1,Arr1.Length)就可以了.

另外,类似这样的代码:

For i = 0 To n - 1
Console.Write(a(i) & Space(1))
Next


在实际中还是少用,因为&操作每次循环都会申请一个比较略大一点点的数组,然后将原来的拷贝过来,再添加新元素,如果n>100000大家可以试一下,速度很慢..Net Framework中提供了一种缓冲类,效率很高.例如:

Dim s1 As StringBuilder = New StringBuilder("")
Dim i As Long
For i = 0 To n-1
s1.Append(CStr(Arr(i)) + Space(2))
Next

当然需要先引用:Imports System.Text.

在vb6中也有这个问题,但没有提供类似上面的StringBuilder类,不过也有很好的优化,具体请参见:
http://19880711.com/blog/read.php?894

Gangelwn 2008-12-12
  • 打赏
  • 举报
回复
a(i) = Console.ReadLine() '这里不能使用Read
我调试过了不行啊,用Console.ReadLine() 会出错啊
我的For j = n To i + 1 Step -1 是漏掉了Step -1
加上去了
关键是我的程序运行得不到正常结果。。。
不知道是哪语句用错了?
Gangelwn 2008-12-11
  • 打赏
  • 举报
回复
二楼的改了这个语句a(i) = Console.ReadLine() 这是读取下一行字符的输入函数
不行啊,执行出错
一楼的只是一个函数,利用你的函数写也是得不到结果

我觉的我算法没问题,实现从大到小排序
应该是其他一些语句上的用法不对。。
由于没写过控制台程序,所以对这些语句不是很熟悉,哪里错了也不知道
root_ 2008-12-11
  • 打赏
  • 举报
回复
Module Module1
Sub Main()
Dim i, j, n, tmp As Integer
Dim a() As Integer
Console.Write("请输入n:")
n = Console.ReadLine()
ReDim a(n)
Console.WriteLine("请输入" & n & "个数:")
For i = 0 To n - 1
a(i) = Console.ReadLine()
Next
For i = 0 To n - 2
For j = i + 1 To n - 1
If a(i) > a(j) Then
tmp = a(i)
a(i) = a(j)
a(j) = tmp
End If
Next
Next
Console.WriteLine("输出排序后的数:")
For i = 0 To n - 1
Console.Write(a(i) & Space(1))
Next
Console.ReadKey()
End Sub
End Module
wuyq11 2008-12-11
  • 打赏
  • 举报
回复
Public Sub BubbleSort(ByVal R As Integer())
Dim i As Integer, j As Integer, temp As Integer
Dim exchange As Boolean

For i = 0 To R.Length - 1
exchange = False
For j = R.Length - 2 To i Step -1
If R(j + 1) < R(j) Then
temp = R(j + 1)
R(j + 1) = R(j)
R(j) = temp
exchange = True
End If
Next

If Not exchange Then
Exit For
End If
Next
End Sub

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧