标题:求助!!请问对一维数组排序报溢出堆栈空间错误怎么修改?
只看楼主
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
得分:0 
回复 10楼 冬瓜汤
前辈您好,我将您的程序带入我的数据中测试,大约近20万数据,的确不溢出了,谢谢!但是有个问题还需要请教:
您的程序针对数据类型为long时,排序是正确的,但如果数据类型是doubles时,排序仅对整数部分有效,对小数部分无效(我把数组、a、b三处的数据类型修改成doubles了),结果如下图:


您帮忙看一下,我程序里哪里写错了或者哪里还需要做出修改的,麻烦请告之,谢谢。

附,我将您的程序带入我的数据中测试的源码:
数据测试.rar (3.77 MB)
2023-02-20 23:07
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
得分:0 
回复 10楼 冬瓜汤
前辈您好,我更换了一种排序方式,比您的方法速度慢了一些,但大约20万的数据也不会报溢出了,Double数据格式排序顺序也是正确了,现向您汇报一下,谢谢您的孜孜不倦的教导,让我对VB的编程技巧有了更深入的了解,谢谢您。
附,修改过的程序。
数据测试-2.rar (3.77 MB)



[此贴子已经被作者于2023-2-21 10:25编辑过]

2023-02-21 10:23
冬瓜汤
Rank: 2
等 级:论坛游民
威 望:1
帖 子:15
专家分:75
注 册:2023-1-30
得分:0 
@11楼
你说的是对的。quicksort() 对浮点数或currency 排序,不能正确排序。关键问题是出在 comparator上面。改成下面的代码:
Public Function Comparator CDecl(ByRef a _
                 As Double, ByRef b _
                 As Double) As Long
    Comparator = IIf((a - b) > 0, 1, -1)
End Function
注意:对于浮点数或currency,用IIF(),返回 1或-1 这样的long值,只用1,-1这两个值!
虽然会影响性能,如20万long排序 182毫秒左右,20万double或currency排序是359毫秒左右,但还是在可承受范围。


[此贴子已经被作者于2023-2-21 10:32编辑过]

2023-02-21 10:29
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
得分:0 
回复 13楼 冬瓜汤
前辈您好,还有一个问题想请教一下:
您可以看到我提供的数据CSV里有很多参数,除去b(19)列外,我还需要对我还要分别对b(18)列,b(22)列,b(15)列,b(13)列,b(11)列分别读到数组a2_sj、a3_sj、a4_sj、a5_sj、a6_sj里,然后排序,然后输出到各个不同的文件里,重复调用语句:
qsort a1_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a2_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a3_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a4_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a5_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

qsort a6_sj(1), pass_num, LenB(a4_sj(1)), AddressOf Comparator

发现排序越来越慢,然后会报错,这种情况怎么解决?

附:新修改的程序。
数据测试-3.rar (3.77 MB)
2023-02-21 17:01



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




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

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