|
-
Jan 21st, 2002, 05:23 AM
#1
Thread Starter
Hyperactive Member
-
Jan 21st, 2002, 06:55 AM
#2
Frenzied Member
Before you start worrying about it too much, ask yourself if you really need this to be an array. It looks to me like what you really want it a one-dimensional array of structures. If you already have the code to sort a one-dimensional array, I expect the easiest solution would be to use structs instead of 3-element arrays.
Harry.
"From one thing, know ten thousand things."
-
Jan 21st, 2002, 07:01 AM
#3
Thread Starter
Hyperactive Member
-
Jan 21st, 2002, 08:13 AM
#4
Thread Starter
Hyperactive Member
Here is what I did...
This assumes the size/arrangement of elements in the variant, but that is fine for me:
Code:
void CXMLHandler::QuickSortRecursive(COleSafeArray *pArr, long lo, long hi, long iSortBy, long iDims, BOOL bAscending)
{
long i, j, k, indexes[2];
COleVariant vStrTemp;
CString strStart, strI, strJ, strIK, strJK;
strI.Empty();
strJ.Empty();
strStart.Empty();
indexes[1] = iSortBy;
indexes[0] = ((long)((lo+hi) / 2));
pArr->GetElement(indexes, &vStrTemp);
strStart = vStrTemp.bstrVal;
i = hi;
j = lo;
do
{
indexes[1] = iSortBy;
indexes[0] = j;
pArr->GetElement(indexes, &vStrTemp);
strJ = vStrTemp.bstrVal;
indexes[0] = i;
pArr->GetElement(indexes, &vStrTemp);
strI = vStrTemp.bstrVal;
if (bAscending)
{
while (strJ < strStart)
{
j++;
indexes[0] = j;
pArr->GetElement(indexes, &vStrTemp);
strJ = vStrTemp.bstrVal;
}
while (strI > strStart)
{
i--;
indexes[0] = i;
pArr->GetElement(indexes, &vStrTemp);
strI = vStrTemp.bstrVal;
}
}
else
{
while (strJ > strStart)
{
j++;
indexes[0] = j;
pArr->GetElement(indexes, &vStrTemp);
strJ = vStrTemp.bstrVal;
}
while (strI < strStart)
{
i--;
indexes[0] = i;
pArr->GetElement(indexes, &vStrTemp);
strI = vStrTemp.bstrVal;
}
}
if (i >= j)
{
if (i != j)
{
indexes[0] = i;
vStrTemp = strJ;
pArr->PutElement(indexes, &vStrTemp);
indexes[0] = j;
vStrTemp = strI;
pArr->PutElement(indexes, &vStrTemp);
for (k = 0; k <= iDims; k++)
{
if (k != iSortBy)
{
indexes[1] = k;
indexes[0] = i;
pArr->GetElement(indexes, &vStrTemp);
strIK = vStrTemp.bstrVal;
indexes[0] = j;
pArr->GetElement(indexes, &vStrTemp);
strJK = vStrTemp.bstrVal;
vStrTemp = strIK;
pArr->PutElement(indexes, &vStrTemp);
indexes[0] = i;
vStrTemp = strJK;
pArr->PutElement(indexes, &vStrTemp);
}
}
}
i--;
j++;
}
} while (j <= i);
if (lo < i) QuickSortRecursive(pArr, lo, i, iSortBy, iDims, bAscending);
if (j < hi) QuickSortRecursive(pArr, j, hi, iSortBy, iDims, bAscending);
}
      
Dan
Outside of a dog, a book is a man's best friend.
Inside of a dog, it's too dark to read.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|