作者niwat (原来如此)
看板Visual_Basic
标题[.NET] 作业(自我学习) QuickSort
时间Sat Oct 19 06:12:27 2013
请输入专案类型(网站专案或者应用程式专案):windows application
非CS 学生, 因为有写程式的需求, 自行修习程式写作
看到网路上有关递回作的作业(QSort), 就尝试写了一个程式, 程式码如下
程式执行结果是成功的, 不过有一些疑惑希望大家提供意见
(ps. 非CS背景, 所以程式大部分都只要求能用就好, 但如果是作业的话,
还是希望知道比较好的写法以及需要改进的地方)
[前提] 用来排序的阵列(T_Array)都是integer且不重复,
随机选取开始的位置(T2)
[问题]
1. 我的写法是用回圈抓数字和T_Array(T2)比,
比T_Array(T2)大的从最右边开始往左填
比T_Array(T2)小的从最左边开始往右填
是否应该以T_Array(T2)为参考点, 分别由中间往两边填, 才符合Qsort要求?
2. 我的程式中每次执行都会宣告一个等大的阵列(写起来方便)
然後再把排好的数字用for next回圈填回原阵列
感觉上很消耗记忆体空间以及运算次数
且好像有点失去递回的感觉, 没有记忆体堆叠的感觉?
一般CS学生 在做这个作业的时候有比较快速或是比较好的写法吗?
3. 如果你是改这份作业的人, 会在写法上提供甚麽建议呢?
谢谢大家
----以下是程式码
Private Sub Q_Sort _
(ByRef T_Array() As Integer, ByVal T1 As Integer, _
ByVal T2 As Integer, ByVal T3 As Integer)
Dim i As Integer
Dim T_Value As Integer
Dim m, n As Integer
Dim Temp_A() As Integer = New Integer() {}
Dim R_Gen As New Random
Dim TempIndex As Integer
Dim a1, a2, a3 As Integer
Dim b1, b2, b3 As Integer
ReDim Temp_A(UBound(T_Array))
T_Value = T_Array(T2)
m = 0
n = 0
For i = T1 To T3
If i <> T2 Then
If T_Array(i) > T_Value Then
Temp_A(T3 - n) = T_Array(i)
n = n + 1
Else
Temp_A(T1 + m) = T_Array(i)
m = m + 1
End If
End If
Next i
For i = T1 To T3
T_Array(i) = Temp_A(i)
Next
T_Array(T1 + m) = T_Value
'MsgBox(T_Value)
'Show_Array(T_Array)
Acc_Arrays(T_Array, Q_No, T_Value, T2)
Q_No = Q_No + 1
a1 = T1
a3 = T1 + m - 1
If m > 2 Then
a2 = R_Gen.Next(a1, a3)
Call Q_Sort(T_Array, a1, a2, a3)
Else
Swap_Value(T_Array(a1), T_Array(a1 + 1))
End If
b1 = T3 - n + 1
b3 = T3
If n > 2 Then
b2 = R_Gen.Next(b1, b3)
Call Q_Sort(T_Array, b1, b2, b3)
Else
Swap_Value(T_Array(b3 - 1), T_Array(b3))
End If
End Sub
Private Sub Swap_Value(ByRef N_Small As Integer, ByRef N_Large As Integer)
Dim TempV As Integer
If N_Small > N_Large Then
TempV = N_Large
N_Large = N_Small
N_Small = TempV
End If
End Sub
※ 编辑: niwat 来自: 128.123.166.46 (10/19 06:32)
1F:→ niwat:这个作业这样写还算及格吧? 10/25 00:25