|
16. Á¤·Ä ¼¼ ¹ø° À̾߱⠾ȳçÇϼ¼¿ä, ¿À´ÃÀº Á¤·Ä¿¡ °üÇÑ ¸¶Áö¸· ½Ã°£À¸·Î Dave SteppanÀÇ Á¤·ÄÇÔ¼ö¸¦ ¼³¸íÇص帮°íÀÚ ÇÕ´Ï´Ù. Áö³ ½Ã°£¿¡ ÀÌ°ÍÀ» °¡Áö°í ÆûÀ» ¸¸µé¾î 4°³ ÀÌ»óÀÇ Å°¸¦ È¿°úÀûÀ¸·Î Á¤·ÄÇÏ´Â °ÍÀ» º¸¿©µå·È½À´Ï´Ù.
ÇÁ·Î½ÃÁ®´Â 2°³ÀÔ´Ï´Ù. Çϳª´Â MultiColumnSort()ÇÔ¼öÀÌ°í, ³ª¸ÓÁö Çϳª´Â RankSort()ÇÁ·Î½ÃÁ®ÀÔ´Ï´Ù. ±×¸®°í MultiColumnSort()°¡ RankSort()¸¦ È£ÃâÇÕ´Ï´Ù. ¾Ë°í¸®ÁòÀÇ ´ë°À» ¼³¸íµå¸®ÀÚ¸é MultiColumnSort()ÇÔ¼ö´Â Á¤·ÄÇÒ ¸ñ·Ï°ú Á¤·Ä¼ø¼¸¦ ÀԷ¹޽À´Ï´Ù. ±×¸®°í ¸ñ·Ï³» °¢ ¿ÀÇ ±æÀ̸¦ °íÁ¤½ÃÅ°°í ¸ñ·ÏÀÇ °¢ ¿À» Çϳª·Î ÇÕÃÄ RankSort()¿¡ ³Ñ°ÜÁÝ´Ï´Ù. ±×¸®°í RankSort()ÇÔ¼ö´Â ÇϳªÀÇ ¿·Î ÇÕÃÄÁø º¤Å͸¦ ¹Þ¾Æ ´Ü¼øÈ÷ Á¤·ÄÇÕ´Ï´Ù. ±×°É·Î ³¡ÀÔ´Ï´Ù.
¼³¸íÀ» À§ÇØ ´ÙÀ½°ú °°Àº µ¥ÀÌÅ͸¦ Á¤·ÄÇÑ´Ù°í °¡Á¤ÇÏ°Ú½À´Ï´Ù.
Function MultiColumnSort(UnSortedArray As Variant, SortOrder As Integer)
Dim OriginalArray As Variant
Dim SortedArray As Variant
Dim SingleList As Variant
Dim MaxStringLen As Variant
'Make a copy of the unsorted array
OriginalArray = UnSortedArray
Á¤·ÄµÇÁö ¾ÊÀº ¿øº»À» OriginalArray¿¡ º¹»çÇÕ´Ï´Ù.
'For loop bounds...
NumRows = UBound(UnSortedArray, 1)
ÇàÀÇ °³¼ö¸¦ ¾Ë¾Æ³À´Ï´Ù. À§ÀÇ ¿¹¿¡¼´Â 9°¡ µË´Ï´Ù.
NumCols = UBound(UnSortedArray, 2)
¿ÀÇ °³¼ö¸¦ ¾Ë¾Æ³À´Ï´Ù. À§ÀÇ ¿¹¿¡¼± 4°¡ µË´Ï´Ù.
UBound()ÇÔ¼ö¿Í LBound()ÇÔ¼ö´Â ¹è¿ÀÇ »óÀ§À妽º °ª°ú ÇÏÀ§À妽º °ªÀ»
¾Ë·ÁÁÝ´Ï´Ù. ±×·±µ¥ ¹è¿ÀÌ 1Â÷¿ø ÀÌ»óÀÌ¸é ¹è¿¸í ´ÙÀ½¿¡ Á¶»çÇÒ Â÷¿øÀ» ÁöÁ¤ÇÕ´Ï´Ù.
ReDim SingleList(1 To NumRows)
Á¤·ÄÇÒ ¸ñ·ÏÀ»°¡Áú SingleList()¹è¿°ú °¢ ¿¿¡¼ ÃÖ°í ±æÀÌ(¹®ÀÚ¿·Î »ý°¢ÇßÀ»¶§)¸¦ °¡Áø °ªÀ» ÀúÀåÇÒ MaxStringLen()¹è¿À» Çà°ú ¿ÀÇ ¼ö¸¸Å ¹è¿ÀÇ Å©±â¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
'Find max length string in each column
For j = 1 To NumCols
À§ÀÇ ¹Ýº¹¹®¿¡¼´Â °¢ ¿¿¡¼ ¹®ÀÚ¿ÀÇ ÃÖ´ë±æÀ̸¦ ¾Ë¾Æ³» MaxStringLen()¹è¿¿¡ ÀúÀåÇÕ´Ï´Ù. À§ÀÇ ¿¹¿¡¼± ´ÙÀ½°ú °°Àº °á°ú¸¦ º¸¿©ÁÙ °Ì´Ï´Ù.
MaxStringLen(1)
|
MaxStringLen(2)
|
MaxStringLen(3)
|
MaxStringLen(4)
|
3
|
2
|
1
|
1
|
'Make all strings in each column the same length
'by adding Chr(0) to make the same length
For j = 1 To NumCols
For i = 1 To NumRows
Do While Len(UnSortedArray(i, j)) < MaxStringLen(j)
UnSortedArray(i, j) = UnSortedArray(i, j) & Chr(0)
Loop
Next
Next
´Ù½Ã Á¤·ÄµÇÁö ¾ÊÀº ¸ñ·ÏÀ» ÀÏÀÏÀÌ ¹Ýº¹ÇÏ¸é¼ °¢ ¹è¿¿ä¼ÒÀÇ ±æÀ̸¦ ±× ¿ÀÇ ÃÖ´ë¹®ÀÚ¿ ±æÀÌ¿¡ ¸ÂÃç Chr(0)°ªÀ¸·Î ä¿ó´Ï´Ù. ÀÌ°ÍÀº Á¤·ÄÀ» ¿øÇÒÇÏ°Ô Çϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ¼ø¼´ë·Î ¹øÈ£¸¦ ºÙ¿© ÆÄÀÏÀ» ¸¸µé´Ùº¸¸é Ž»ö±â¿¡¼ ÆÄÀÏÀ̸§À¸·Î Á¤·ÄÇصµ ÆÄÀÏÀÇ ¼ø¼°¡ ¾ûÅ͸®·Î Á¤·ÄµÈ °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
°¡·É 1.xls, 2.xls, 3.xls, 4.xls, 5.xls, 6.xls, 7.xls, 8.xls, 9.xls, 10.xls, 11.xls, 12.xls, 13.xls, 14.xls, 15.xls, 16.xls, 17.xls, 18.xls, 19.xls, 20.xls, 21.xls, 22.xls µîµîÀÇ ÆÄÀÏÀÌ ÀÖ´Â °æ¿ì À̸§¼ø¼·Î Á¤·ÄÇϸé 1.xls, 10.xls, 11.xls, 12.xls, 13.xls, 14.xls, 15.xls, 16.xls, 17.xls, 18.xls, 19.xls, 2.xls, 20.xls, 21.xls, 22.xls, 3.xls, 4.xls, 5.xls, 6.xls, 7.xls, 8.xls, 9.xls ¼ø¼´ë·Î µË´Ï´Ù.
±×·¡¼ ÀÌ·± Çö»óÀ» ¿¹¹æÇϱâ À§ÇØ 01.xls, 02.xls, 03.xls,...µîµî 10ÀÌÇÏÀÇ À̸§À» °®´Â °æ¿ì "0"À» ºÙ¿© ÁÝ´Ï´Ù. °°Àº ÀÌÀ¯·Î ¿©±â¿¡¼µµ Chr(0)°ªÀ» ¿ÀÇ ÃÖ´ë°ª¸¸Å ¸ÂÃß¾î ºÙ¿©ÁÝ´Ï´Ù. µû¶ó¼ À§ÀÇ ¿¹¿¡ µû¸¥ °á°ú´Â ´ÙÀ½°ú °°À» °Ì´Ï´Ù.
a00
|
b0
|
d
|
1
|
aa0
|
b0
|
e
|
2
|
aaa
|
b0
|
e
|
3
|
a00
|
bb
|
d
|
4
|
aa0
|
bb
|
e
|
5
|
aaa
|
bb
|
e
|
6
|
a00
|
a0
|
d
|
7
|
aa0
|
a0
|
d
|
8
|
aaa
|
a0
|
d
|
9
|
(Chr(0)°ªÀ» 0À̶ó°í °¡Á¤ÇÏ´Â °æ¿ì)
'Concatenate strings to make array into a single
'vector to sort
For i = 1 To NumRows
For j = 1 To NumCols
SingleList(i) = SingleList(i) & UnSortedArray(i, j)
Next
Next
ÀÏÁ¤ÇÑ Å©±â·Î ä¿öÁø °¢ ¿ÀÇ °ªÀ» Çึ´Ù ¸ðµÎ ÇÕÃÄ ÇϳªÀÇ µ¥ÀÌÅͷΠǥ½ÃÇÕ´Ï´Ù. ÀÌ °á°ú
SingleList()ÀÇ °ªÀº ´ÙÀ½°ú °°À» °Ì´Ï´Ù.
SingleList(1)
|
a00b0d1
|
SingleList(2)
|
aa0b0e2
|
SingleList(3)
|
aaab0e3
|
SingleList(4)
|
a00bbd4
|
SingleList(5)
|
aa0bbe5
|
SingleList(6)
|
aaabbe6
|
SingleList(7)
|
a00a0d7
|
SingleList(8)
|
aa0a0d8
|
SingleList(9)
|
aaaa0d9
|
'Use a traditional single array sorting algorithm
Call RankSort(SingleList, SortOrder, RankList)
Á¤·ÄÇÏ´Â ÇÁ·Î½ÃÁ®¸¦ È£ÃâÇÕ´Ï´Ù. Á¤·ÄµÈ °á°ú´Â RankList()¿¡ ÀúÀåµË´Ï´Ù.
ReDim SortedArray(1 To NumRows, 1 To NumCols)
Á¤·ÄµÈ ¸ñ·ÏÀ» ÀúÀåÇÒ ¹è¿ÀÇ Å©±â¸¦ Á¤ÇÕ´Ï´Ù.
'Translate results back into a sorted array
For k = 1 To NumRows
For j = 1 To NumRows
If k = RankList(j) Then
For i = 1 To NumCols
SortedArray(k, i) = OriginalArray(j, i)
Next
End If
Next
Next
Á¤·ÄµÈ °á°ú¿¡ µû¶ó ¿øº»À» Á¤·ÄÇÑ ¼ø¼´ë·Î ¿Å°Ü ÀúÀåÇÕ´Ï´Ù. Sub RankSort() ÇÁ·Î½ÃÀúÀÇ ½ÇÇà°á°ú
RankList()¹è¿¿¡´Â °¢ ÇàÀÇ ¼øÀ§°¡ µé¾î°©´Ï´Ù. ±×¸®°í ±×¼øÀ§¿¡ ¸ÂÃç ¿øº»µ¥ÀÌÅ͸¦ Á¤·ÄµÈ ¹è¿(SortedArray())¿¡ ÀúÀåÇÕ´Ï´Ù.
'Feed the beast output
MultiColumnSort = SortedArray
End Function
Sub RankSort()´Â ½ÇÁ¦ Á¤·ÄÀ» ÇÏ´Â ºÎºÐÀÔ´Ï´Ù. ÀúÀÚÀÇ ÁÖ¼®('Use a traditional single array sorting algorithm')´ë·Î Æò¹üÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù°í ÇÏÁö¸¸ ¾Ë°í¸®ÁòÀÌ ±×·¸µí µûÁö°í µé·Á´Ï ¸Å¿ì ¸Ó¸®°¡ ¾îÁö·´±º¿ä. Çؼ®Àº ¾ÈÇÏ°í Åë°úÇÏ°Ú½À´Ï´Ù(Àúµµ ²Ò°¡ ³ª¼ ^^;)
¾Æ¸¶ ´ÙÀ½ Ä÷³Àº »õÇØ¿¡ ½ÃÀÛÇÒ °Í °°½À´Ï´Ù. ¹Ì¸® Àλ縦 µå¸³´Ï´Ù. Áñ°Å¿î ¿¬¸»À» º¸³»½Ã°í, »õÇØ
º¹ ¸¹ÀÌ ¸¹À¸½Ê½Ã¿À. ²Ù¹÷
Sub RankSort(IArray, ByVal nOrder As Integer, rankarray)
Dim Distance
Dim Size
Dim Index
Dim NextElement
Dim TEMP
Dim trankarray() As Integer
ReDim trankarray(LBound(IArray) To UBound(IArray))
For i = LBound(IArray) To UBound(IArray)
trankarray(i) = i
Next
ASCENDING_ORDER = 1
DESCENDING_ORDER = -1
Size = UBound(IArray) - LBound(IArray) + 1
Distance = 1
While (Distance <= Size)
Distance = 2 * Distance
Wend
Distance = (Distance / 2) - 1
While (Distance > 0)
NextElement = LBound(IArray) + Distance
While (NextElement <=
UBound(IArray))
Index = NextElement
Do
If Index >= (LBound(IArray) + Distance) Then
If nOrder = ASCENDING_ORDER Then
If IArray(Index) < IArray(Index - Distance) Then
TEMP = IArray(Index)
IArray(Index) = IArray(Index - Distance)
IArray(Index - Distance) = TEMP
TEMP = trankarray(Index)
trankarray(Index) = trankarray(Index - Distance)
trankarray(Index - Distance) = TEMP
Index = Index - Distance
gIterations = gIterations + 1
Else
Exit Do
End If
ElseIf nOrder = DESCENDING_ORDER Then
If IArray(Index) >= IArray(Index - Distance) Then
TEMP = IArray(Index)
Array(Index) = IArray(Index - Distance)
IArray(Index - Distance) = TEMP
TEMP = trankarray(Index)
trankarray(Index) = trankarray(Index - Distance)
trankarray(Index - Distance) = TEMP
Index = Index - Distance
gIterations = gIterations + 1
Else
Exit Do
End If
End If
Else
Exit Do
End If
Loop
NextElement = NextElement + 1
gIterations = gIterations + 1
Wend
Distance = (Distance - 1) / 2
gIterations = gIterations + 1
Wend
ReDim rankarray(LBound(IArray) To UBound(IArray))
For i = LBound(IArray) To UBound(IArray)
rankarray(trankarray(i)) = i
Next
End Sub
¡¡
|