| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1508 人关注过本帖
标题:求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
只看楼主 加入收藏
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
结帖率:70%
收藏
已结贴  问题点数:20 回复次数:13 
求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
我想对数组内的数据按大小进行排序,大约20万条,用了两种方法,都会报:“实时错误 28  ,溢出堆栈空间”错误,我不断减少数据数量,15万条,10万条,5万条,大约在5万条左右就可以正常排序,请问,如何对程序修改,才能使其在20万条左右不会发生错误?

排序方法1(这个排序速度较快):

程序代码:
Private Sub Command1_Click()
    Call qsort(sj, 1, max_num) '对数组使用二分法
End Sub

Sub qsort(px() As Double, ByVal kaishi As Long, ByVal jieshu As Long)
    Dim temp As Double, j As Long, i As Long
    i = kaishi: j = jieshu '将i、j作为指针,从两侧向中部移动
    If kaishi < jieshu Then '控制是否进入循环
        temp = px(kaishi) '将数组第一个值赋给temp,暂时充当对比量
        While i < j
            Do While i < j '指针j从右向左移动,当遇到比temp小的数时,将该值移动到指针i的位置,并使i向右移动一位
                If px(j) <= temp Then px(i) = px(j): i = i + 1: Exit Do
                j = j - 1
            Loop
            Do While i < j '指针i从左向右移动,当遇到比temp大的数时,将该值移动到指针j的位置,并使j向左移动一位
                If px(i) > temp Then px(j) = px(i): j = j - 1: Exit Do
                i = i + 1
            Loop
        Wend
        px(i) = temp
        Call qsort(px(), kaishi, i - 1) '递归二分法过程进行排序
        Call qsort(px(), i + 1, jieshu)
    Else
        Exit Sub
    End If
End Sub



第二种方法(排序速度较慢):

程序代码:
Private Sub Command1_Click()
            l = max_num: S = 1: ReDim Num(l)
        For px_i = S To l
            Num(px_i) = sj(px_i)
        Next px_i
        Call QUICK_SORT(S, l, Num)
End Sub

'快速排序程序===========================================
Private Sub Exchange(ByRef n1 As Double, ByRef n2 As Double)
    Dim t As Double
    t = n1: n1 = n2: n2 = t
End Sub
Private Function PARTITION(ByVal p As Long, ByVal r As Long, ByRef a() As Double) As Long
    Dim X As Double, t As Long, i As Long, j As Long
    Randomize
    t = CLng((r - p) * Rnd + p)
    Call Exchange(a(r), a(t))
    X = a(r): i = p - 1
    For j = p To r - 1
        If a(j) <= X Then i = i + 1: Call Exchange(a(i), a(j))
    Next j
    Call Exchange(a(i + 1), a(r))
    PARTITION = i + 1
End Function
Private Sub QUICK_SORT(ByVal p As Long, ByVal r As Long, ByRef a() As Double)
    If p < r Then
        Dim q As Long
        q = PARTITION(p, r, a)
        Call QUICK_SORT(p, q - 1, a)
        Call QUICK_SORT(q + 1, r, a)
    End If
End Sub


请版主大人和过往高手大人不吝赐教!感谢!
搜索更多相关主题的帖子: Call Long Sub End 排序 
2023-02-18 21:39
冬瓜汤
Rank: 2
等 级:论坛游民
威 望:1
帖 子:18
专家分:75
注 册:2023-1-30
收藏
得分:10 
Option Explicit

Private Declare Sub qsort CDecl Lib "msvcrt" ( _
                         ByRef pFirst As Any, _
                         ByVal lNumber As Long, _
                         ByVal lSize As Long, _
                         ByVal pfnComparator As Long)
               
Sub Main()
    Dim z() As Long
    Dim i As Long
    Dim s As String
   
    ReDim z(200000)
    Randomize
    For i = 0 To UBound(z)
        z(i) = Int(Rnd * 1000000)
    Next
   
    qsort z(0), UBound(z) + 1, LenB(z(0)), AddressOf Comparator
   
    Debug.Print "20万排序计时:" & GetTickCount() - t1 & "毫秒"
    For i = 1999991 To UBound(z)   '为节省时间,二十万个数据取最后10个数据看一下
        Debug.Print z(i)
    Next

End Sub

Private Function Comparator CDecl( _
                 ByRef a As Long, _
                 ByRef b As Long) As Long
    Comparator = a - b
End Function
图片附件: 游客没有浏览图片的权限,请 登录注册


VBCdeclFixDll插件https://wwi.

[此贴子已经被作者于2023-2-19 12:44编辑过]

2023-02-19 02:00
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 2楼 冬瓜汤
大神,您的源码我无法使用,标红。如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册

我查了一下,cdecl库是c函数库,vb6要使用的话,需要打cdecl补丁,我也下载了,如下:
VBCDeclFix.rar (1019.76 KB)

但这个补丁我不会打,请教如何打这个补丁?
2023-02-19 08:22
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
递归层次过深爆栈了。
可先用桶排,再对每个桶用你自己的快排,如果数据均匀的话,20万条数据,使用1000个桶,每个桶平均只有200个数据,再递归就不会爆栈了(其实这时用插入排序或希尔排序效率较高,不需要递归)。速度会慢一点。

能编个毛线衣吗?
2023-02-19 09:00
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
麻烦提供一下实例或者在我提供的源码里修改,两个排序方法也是根据在网上找到的实例修改的,我对数组排序不是很会😓
2023-02-19 09:49
冬瓜汤
Rank: 2
等 级:论坛游民
威 望:1
帖 子:18
专家分:75
注 册:2023-1-30
收藏
得分:0 
回复 5楼 ictest
让我有点吃惊。我在上面2楼的回复 重贴一下 纯activeX dll下载链接,并附上 注册控件的 bat(路径自己填写,以管理员权限运行)。
2023-02-19 12:50
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 6楼 冬瓜汤
真是对不起,您在二楼回复的DLL文件我没有看到,导致我重新在网上寻找,也不知道找到的是什么看不懂的东东,真是对不起!

您提供的DLL文件我已经加载成功,如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册


但是,您提供的源码我怎么也运行不到您回复的结果图片那样的,我试了两种方式,都不行,都报错:
方式1:
方式1.rar (1.56 KB)

结果是:
图片附件: 游客没有浏览图片的权限,请 登录注册



方式2:
方式2.rar (1.36 KB)

结果是:
图片附件: 游客没有浏览图片的权限,请 登录注册


真是不好意思,还能不吝指教指教吗?谢谢您!
2023-02-19 18:36
冬瓜汤
Rank: 2
等 级:论坛游民
威 望:1
帖 子:18
专家分:75
注 册:2023-1-30
收藏
得分:0 
因为是vb6的插件。所以你要在 外接程序管理器中启动它
图片附件: 游客没有浏览图片的权限,请 登录注册
2023-02-19 19:02
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:333
专家分:114
注 册:2010-2-17
收藏
得分:0 
回复 8楼 冬瓜汤
我加载了啊。
图片附件: 游客没有浏览图片的权限,请 登录注册


您能把您的源码在VB6里做好保存一下发给我试一下吗?

另外,我一直没搞懂您的源码里没有Command1_Click()怎么运行的呢?又不是Private Sub Form_Load()加载窗体后直接运行..........
2023-02-19 20:03
冬瓜汤
Rank: 2
等 级:论坛游民
威 望:1
帖 子:18
专家分:75
注 册:2023-1-30
收藏
得分:10 
我用你的 方式一 例子,重新调整一下 ,可以运行。
调用 cdecl协议 的函数,只能放在 模块中,不能放在 窗体或 类中声明。原因,以后你用多了,慢慢就会明白了。
修改后可运行的方式1.rar (1.53 KB)

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2023-2-20 14:19编辑过]

2023-02-20 14:17
快速回复:求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
数据加载中...
 
   



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

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