C++ 用于移植到C+;的文本字符串的3向基数快速排序+;来自Java
我已经移植到C++(我猜大部分是C)这个java 3路<强>基<强>快排序实现():< /p> 然而,这些元素被搅乱了。调用DLL后,数组如下所示:C++ 用于移植到C+;的文本字符串的3向基数快速排序+;来自Java,c++,c,excel,bstr,safearray,C++,C,Excel,Bstr,Safearray,我已经移植到C++(我猜大部分是C)这个java 3路基快排序实现():< /p> 然而,这些元素被搅乱了。调用DLL后,数组如下所示: a(0) = Arborside a(1) = Capine a(2) = Dalltal a(3) = Irvi a(4) = Konaerry a(5) = Mayberhaven a(6) = Rivelwater a(7) = Roanas a(8) = Stiloke a(9) = Wintr 看起来每个元素的左四个字符都已排序,但其余字符仍然未排
a(0) = Arborside
a(1) = Capine
a(2) = Dalltal
a(3) = Irvi
a(4) = Konaerry
a(5) = Mayberhaven
a(6) = Rivelwater
a(7) = Roanas
a(8) = Stiloke
a(9) = Wintr
看起来每个元素的左四个字符都已排序,但其余字符仍然未排序
您能帮我修复端口使其正常工作吗?exch功能的实现在哪里?您的
无效交换点(长**a,长**b){
交换长
,长度为4字节(或四个字符)@VladFeinstein:这可能就是问题所在。你能推荐一种方法来交换指向BSTR元素的指针,这样每个元素都可以整体交换吗?为了速度起见,我想交换指针。那些宽字符是吗?如果是,那么所有对LPSTR
的转换都是不正确的。事实上,请删除所有这些字符这些类型转换。一旦这样做,请读取编译器生成的错误。除非您知道自己在做什么,否则不要尝试使用C样式转换来掩盖这些错误。如果字符是2字节字符,请再次删除这些类型转换并修复编译器错误。对LPSTR
进行类型转换不会将多字节字符串转换为单字节字符串,可能是排序失败的原因。最简单的方法是在不同语言之间使用相同的字符类型,而不是不同的类型。exch
函数的实现在哪里?您的无效交换点(long**a,long**b){
交换long
,长度为4字节(或四个字符)@VladFeinstein:这可能就是问题所在。你能推荐一种方法来交换指向BSTR元素的指针,这样每个元素都可以整体交换吗?为了速度起见,我想交换指针。那些宽字符是吗?如果是,那么所有对LPSTR
的转换都是不正确的。事实上,请删除所有这些字符这些类型转换。一旦这样做,请读取编译器生成的错误。除非您知道自己在做什么,否则不要尝试使用C样式转换来掩盖这些错误。如果字符是2字节字符,请再次删除这些类型转换并修复编译器错误。对LPSTR
进行类型转换不会将多字节字符串转换为单字节字符串,可能是排序失败的原因。最简单的方法是在不同语言之间使用相同的字符类型,而不是不同的类型。
void swapPointers(long **a, long **b) {
long *t = *a;
*a = *b;
*b = t;
}
long int __stdcall QuicksortX(LPSAFEARRAY FAR *psaBSTRs, long lo, long hi, long d = 0)
{
if (hi - lo <= 0) return 1;
long i = lo-1, j = hi;
long p = lo-1, q = hi;
if ((*psaBSTRs)->cDims > 0) {
long lb = (*psaBSTRs)->rgsabound[0].lLbound;
long ub = lb + (*psaBSTRs)->rgsabound[0].cElements - 1;
if (lo < lb || lo > ub || lo > hi) {return -2;}
if (hi < lb || hi > ub || hi < lo) {return -3;}
} else {
return -1;
}
BSTR *a = (BSTR*)(*psaBSTRs)->pvData;
short v = LPSTR(a[hi])[d];
while (i < j)
{
while (LPSTR(a[++i])[d] < v) if (i == hi) break;
while (v < LPSTR(a[--j])[d]) if (j == lo) break;
if (i > j) break;
swapPointers((long**)a[i], (long**)a[j]);
if (LPSTR(a[i])[d] == v) swapPointers((long**)a[++p], (long**)a[i]);
if (LPSTR(a[j])[d] == v) swapPointers((long**)a[j], (long**)a[--q]);
}
if (p == q) {
if (v != 0) QuicksortX(psaBSTRs, lo, hi, d+1);
return 0;
}
if (LPSTR(a[i])[d] < v) i++;
for (int k = lo; k <= p; k++) swapPointers((long**)a[k], (long**)a[j--]);
for (int k = hi; k >= q; k--) swapPointers((long**)a[k], (long**)a[i++]);
QuicksortX(psaBSTRs, lo, j, d);
if ((i == hi) && (LPSTR(a[i])[d] == v)) i++;
if (v != 0) QuicksortX(psaBSTRs, j+1, i-1, d+1);
QuicksortX(psaBSTRs, i, hi, d);
}
Public Declare Function QuicksortX Lib "StringArraySort" (StringArray$(), Optional ByVal Lo&, Optional ByVal Hi&, Optional ByVal d& = 0) As Long
Sub Test_1()
Dim ret&, a() As String
ReDim a(0 To 9)
a(0) = "Riverside"
a(1) = "Irvine"
a(2) = "Capital"
a(3) = "Kona"
a(4) = "Mayberry"
a(5) = "Winterhaven"
a(6) = "Stillwater"
a(7) = "Dallas"
a(8) = "Roanoke"
a(9) = "Arbor"
ret = QuicksortX(a, LBound(a), UBound(a))
Stop
End Sub
a(0) = Arborside
a(1) = Capine
a(2) = Dalltal
a(3) = Irvi
a(4) = Konaerry
a(5) = Mayberhaven
a(6) = Rivelwater
a(7) = Roanas
a(8) = Stiloke
a(9) = Wintr