瀏覽代碼

Added TLinkedList Sort().

woollybah 6 年之前
父節點
當前提交
bd95f3432a
共有 2 個文件被更改,包括 188 次插入2 次删除
  1. 43 0
      collections.mod/doc/tlinkedlist_sort.bmx
  2. 145 2
      collections.mod/linkedlist.bmx

+ 43 - 0
collections.mod/doc/tlinkedlist_sort.bmx

@@ -0,0 +1,43 @@
+SuperStrict
+
+Framework brl.collections
+Import brl.standardio
+Import brl.Random
+
+SeedRnd(999)
+
+Local numbers:TLinkedList<Int> = New TLinkedList<Int>
+
+For Local i:Int = 0 Until 20
+Local n:Int = Rand(0, 100)
+	numbers.Add(n)
+Next
+
+Print "Unsorted:"
+For Local num:String = EachIn numbers
+	Print num
+Next
+
+numbers.Sort()
+
+Print "~nSorted:"
+For Local num:String = EachIn numbers
+	Print num
+Next
+
+Local reverse:TReverseComparator<Int> = New TReverseComparator<Int>
+
+numbers.Sort(reverse)
+
+Print "~nReversed:"
+For Local num:String = EachIn numbers
+	Print num
+Next
+
+Type TReverseComparator<T> Implements IComparator<T>
+
+	Method Compare:Int(a:T, b:T)
+		Return DefaultComparator_Compare(b, a)
+	End Method
+
+End Type

+ 145 - 2
collections.mod/linkedlist.bmx

@@ -302,7 +302,56 @@ Public
 		
 		RemoveNode(head.previousNode)		
 	End Method
-	
+
+	Rem
+	bbdoc: Sorts the elements in the entire #TLinkedList using the specified comparator, or the default if #Null.
+	End Rem
+	Method Sort(comparator:IComparator<T> = Null)
+
+		If Not head Or head.nextNode = head Then
+			Return
+		End If
+
+		head.previousNode.nextNode = Null
+
+		Local array:TLinkedListNode<T>[32]
+
+		Local result:TLinkedListNode<T> = head
+		
+		While result
+		
+			Local nextNode:TLinkedListNode<T> = result.nextNode
+			result.nextNode = Null
+			
+			Local i:Int
+			While i < array.length
+				If Not array[i] Then
+					Exit
+				End If
+				
+				result = MergeSort(array[i], result, comparator)
+				array[i] = Null
+				
+				i :+ 1
+			Wend
+
+			If i = array.length Then
+				i = array.length - 1
+			End If
+			
+			array[i] = result
+			result = nextNode
+		Wend
+		
+		result = Null
+		For Local i:Int = 0 Until 32
+			result = MergeSort(array[i], result, comparator)
+		Next
+		
+		head = result
+		FixHead()
+	End Method
+
 Private
 	Method ValidateNode(node:TLinkedListNode<T>)
 		If Not node Then
@@ -352,7 +401,87 @@ Private
 		node.previousNode = newNode
 		size :+ 1
 	End Method
-Public
+
+	Method MergeSort:TLinkedListNode<T>(leftNode:TLinkedListNode<T>, rightNode:TLinkedListNode<T>, comparator:IComparator<T>)
+		Local firstNode:TLinkedListNode<T>
+		Local lastNode:TLinkedListNode<T>
+	
+		While leftNode And rightNode
+		
+			Local cc:Int
+			If comparator Then
+				cc = comparator.Compare( leftNode.value, rightNode.value )
+			Else
+				cc = DefaultComparator_Compare(leftNode.value, rightNode.value)
+			End If
+			
+			If cc < 0 Then
+				If Not firstNode Then
+					firstNode = leftNode
+					lastNode = leftNode
+				Else
+					lastNode.nextNode = leftNode
+					leftNode.previousNode = lastNode
+				End If
+				
+				lastNode = leftNode
+				leftNode = leftNode.nextNode
+			Else
+				If Not firstNode Then
+					firstNode = rightNode
+					lastNode = rightNode
+				Else
+					lastNode.nextNode = rightNode
+					rightNode.previousNode = lastNode
+				End If
+				lastNode = rightNode
+				rightNode = rightNode.nextNode
+			End If
+		
+		Wend
+		
+		While leftNode
+			If Not firstNode Then
+				firstNode = leftNode
+				lastNode = leftNode
+			Else
+				lastNode.nextNode = leftNode
+				leftNode.previousNode = lastNode
+			End If
+			lastNode = leftNode
+			leftNode = leftNode.nextNode
+		Wend
+
+		While rightNode
+			If Not firstNode Then
+				firstNode = rightNode
+				lastNode = rightNode
+			Else
+				lastNode.nextNode = rightNode
+				rightNode.previousNode = lastNode
+			End If
+
+			lastNode = rightNode
+			rightNode = rightNode.nextNode
+		Wend
+		
+		Return firstNode
+	End Method
+	
+	Method FixHead()
+		Local node:TLinkedListNode<T> = head
+		Local lastNode:TLinkedListNode<T>
+		
+		While node
+			lastNode = node
+			node = node.nextNode
+		Wend
+		
+		head.previousNode = lastNode
+		lastNode.nextNode = head
+	End Method
+
+	Public
 
 End Type
 
@@ -374,6 +503,20 @@ Public
 		Self.value = value
 	End Method
 	
+	Rem
+	bbdoc: Gets the next node.
+	End Rem
+	Method GetNext:TLinkedListNode<T>()
+		Return nextNode
+	End Method
+	
+	Rem
+	bbdoc: Gets the previousNode
+	End Rem
+	Method GetPrevious:TLinkedListNode<T>()
+		Return previousNode
+	End Method
+	
 Private
 	Method New(list:TLinkedList<T>, value:T)
 		Self.list = list