排序算法问题

snowerhuayun 2009-01-27 03:30:20
按层数,然后按行番号排序,如果父番号排序变了位置,那这个父下面的子全都得随父变.
举例说明

元结果集(排序前)
父番号 层数 番号 行番号
CR001 1 CR0011 1
CR0011 2 CR0021 1
CR0021 3 CR0032 2
CR0021 3 CR0031 1
CR0032 4 CR0041 1
CR0041 5 CR0051 1
CR001 1 CR0012 2
CR0011 2 CR0021 1
CR0021 3 CR0032 2
CR0021 3 CR0031 1
CR0032 4 CR0041 1
CR0041 5 CR0051 1

CR001
|__CR0011
| |__CR0021
| |__CR0032
| |__CR0031
| |__CR0041
| |__CR0051
|__CR0012
|__CR0021
|__CR0032
|__CR0031
|__CR0041
|__CR0051

想出力结果集(排序后)
父番号 层数 番号 行番号
CR001 1 CR0011 1
CR0011 2 CR0021 1
CR0021 3 CR0031 1
CR0032 4 CR0041 1
CR0041 5 CR0051 1
CR0021 3 CR0032 2
CR001 1 CR0012 2
CR0011 2 CR0021 1
CR0021 3 CR0031 1
CR0032 4 CR0041 1
CR0041 5 CR0051 1
CR0021 3 CR0032 2

CR001
|__CR0011
| |__CR0021
| |__CR0031
| | |__CR0041
| | |__CR0051
| |__CR0032
|
|__CR0012
|__CR0021
|__CR0031
| |__CR0041
| |__CR0051
|__CR0032
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
HBJMSHOP 2009-01-29
  • 打赏
  • 举报
回复
happy 牛year
游子 2009-01-27
  • 打赏
  • 举报
回复
我有现成的例子 不过数据库是ACCESS的。
ningyong58 2009-01-27
  • 打赏
  • 举报
回复
对于这么复杂的排序,先练内功,等功力到了,再发表高见.友情顶.
三楼の郎 2009-01-27
  • 打赏
  • 举报
回复
核心就是先取根,然后遍历每个根取得其下属,然后再遍历其下属取得其下属的下属,一直循环下去直到取完所有记录!关键算法就是一个递归。
三楼の郎 2009-01-27
  • 打赏
  • 举报
回复
这是我实现的代码,你参考下吧

Public Function GetModuleList() As Collection
Dim mycollection As New Collection
Call GetSubModuleList(0, mycollection, 1)
Return mycollection
End Function

Private Sub GetSubModuleList(ByVal m_upid As Integer, ByRef mycoll As Collection, ByVal m_deepth As Integer)
Dim strsql As String
strsql = "select m_id,m_name,m_url,m_upid,m_index from System_ModuleList where m_upid=" & m_upid & " order by m_index asc,m_id asc"
Try
Dim ds As DataSet
ds = mydbcontrol.SQLExecute_DataSet(strsql)
If Not IsNothing(ds) Then
For xx As Integer = 0 To ds.Tables(0).Rows.Count - 1
Dim mymodule As New modulelist
With mymodule
.m_id = ds.Tables(0).Rows(xx).Item("m_id")
.m_index = ds.Tables(0).Rows(xx).Item("m_index")
.m_name = ds.Tables(0).Rows(xx).Item("m_name")
.m_upid = ds.Tables(0).Rows(xx).Item("m_upid")
.m_url = ds.Tables(0).Rows(xx).Item("m_url")
.m_lid = m_deepth
End With
mycoll.Add(mymodule, "n" & mymodule.m_id)
mymodule = Nothing
Call GetSubModuleList(ds.Tables(0).Rows(xx).Item("m_id"), mycoll, m_deepth + 1)
Next
End If
ds.Dispose()
Catch ex As Exception

End Try
End Sub
三楼の郎 2009-01-27
  • 打赏
  • 举报
回复
前几天刚用Collection对象实现了一个,不过是在VB.NET下做的!

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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