Solved

# How to do a reverse sort (descending) of filenames using Quicksort function

Posted on 2006-10-26

I'm having a problem trying to do a reverse sort (descending order; Z to A; n to 0).

The Quicksort function (mentioned below) does a sort in ascending order (A to Z; 0 to n) and is an excerpt from a C++ book called "Data Abstractions & Structures using C++". I've used the following code to do a sort of filenames/folders in a customized Enhanced Browser Page for IIS 5.0 and WORKS!!! I've tried to manipulate variables within the function to do a reverse sort however I've had no luck....

My question: How/What do I change the Quicksort function (execerpt below) to sort in descending order (Z to A; n to 0)?

'___________________________________________________________________

Sub QuickSort(vec,loBound,hiBound,SortField)

'==--------------------------------------------------------==

'== Sort a 2 dimensional array on SortField ==

'== ==

'== This procedure is adapted from the algorithm given in: ==

'== ~ Data Abstractions & Structures using C++ by ~ ==

'== ~ Mark Headington and David Riley, pg. 586 ~ ==

'== Quicksort is the fastest array sorting routine For ==

'== unordered arrays. Its big O is n log n ==

'== ==

'== Parameters: ==

'== vec - array to be sorted ==

'== SortField - The field to sort on (2nd dimension value) ==

'== loBound and hiBound are simply the upper and lower ==

'== bounds of the array's 1st dimension. It's probably ==

'== easiest to use the LBound and UBound functions to ==

'== Set these. ==

'==--------------------------------------------------------==

Dim pivot(),loSwap,hiSwap,temp,counter

Redim pivot (Ubound(vec,2))

'== Two items to sort

if hiBound - loBound = 1 then

if vec(loBound,SortField) > vec(hiBound,SortField) then

Call SwapRows(vec,hiBound,loBound)

End If

End If

'== Three or more items to sort

For counter = 0 to Ubound(vec,2)

pivot(counter) = vec(int((loBound + hiBound) / 2),counter)

vec(int((loBound + hiBound) / 2),counter) = vec(loBound,counter)

vec(loBound,counter) = pivot(counter)

Next

'loSwap = loBound + 1

'hiSwap = hiBound

loSwap = loBound + 1

hiSwap = hiBound

Do

'== Find the right loSwap

while loSwap < hiSwap and vec(loSwap,SortField) <= pivot(SortField)

loSwap = loSwap + 1

wend

'== Find the right hiSwap

while vec(hiSwap,SortField) > pivot(SortField)

hiSwap = hiSwap - 1

wend

'== Swap values if loSwap is less then hiSwap

if loSwap < hiSwap then Call SwapRows(vec,loSwap,hiSwap)

Loop While loSwap < hiSwap

For counter = 0 to Ubound(vec,2)

vec(loBound,counter) = vec(hiSwap,counter)

vec(hiSwap,counter) = pivot(counter)

Next

'== Recursively call function .. the beauty of Quicksort

'== 2 or more items in first section

if loBound < (hiSwap - 1) then Call QuickSort(vec,loBound,hiSwap-1,SortField)

'== 2 or more items in second section

if hiSwap + 1 < hibound then Call QuickSort(vec,hiSwap+1,hiBound,SortField)

End Sub 'QuickSort