Code archives/Algorithms/ShuffleArray and ShuffleList
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Requires this archive entry: http://blitzbasic.com/codearcs/codearcs.php?code=3066 https://dl.dropboxusercontent.com/u/10116881/blitz/code/mergesortarray.bmx (Mirror) Copies the list into an array and assigns random doubles to each object, merge sorts the array by the doubles, and returns a list with the same elements in the new, random order. Now with bonus ShuffleArray function, as well! | |||||
' --+-----------------------------------------------------------------------------------------+--
' | This code was originally written by Sophie Kirschner (sophiek@pineapplemachine.com) |
' | It is released as public domain. Please don't interpret that as liberty to claim credit |
' | that isn't yours, or to sell this code when it could otherwise be obtained for free |
' | because that would be a really shitty thing of you to do. |
' --+-----------------------------------------------------------------------------------------+--
SuperStrict
Import brl.linkedlist
Import brl.random
Import "mergesortarray.bmx" ' http://blitzbasic.com/codearcs/codearcs.php?code=3066
' Example code
Rem
Import brl.standardio
SeedRnd Millisecs()
' Generate a list of strings containing the first few letters of the alphabet
Local stringlist:TList=CreateList()
For Local a%=Asc("A") To Asc("F")
stringlist.addlast Chr(a)
Next
' Shuffle the list
Local shuffledlist:TList=ShuffleList(stringlist)
' Display the results
Print "~nList before ShuffleList:"
For Local str$=EachIn stringlist
Print str
Next
Print "~nList after ShuffleList:"
For Local str$=EachIn shuffledlist
Print str
Next
EndRem
' Takes a list as input (and optional arguments for a sorting function that you shouldn't need to touch) and returns a new list with the same contents in a random order.
' The algorithm should be reasonably fast and without any bias.
Function ShuffleList:TList(list:TList,sortfunc(array:Object[],ascending%,comparefunc(o1:Object,o2:Object))=MergeSortArray,comparefunc(o1:Object,o2:Object)=_Array_CompareObjects)
Local listlength%=list.count()
Local nodes:ShuffleNode[]=New ShuffleNode[listlength]
Local listindex%=0
For Local obj:Object=EachIn list
nodes[listindex]=New shufflenode
nodes[listindex].value=obj
listindex:+1
Next
sortfunc(nodes,1,comparefunc)
Local retlist:TList=CreateList()
For Local index%=0 Until nodes.length
retlist.addlast nodes[index].value
Next
Return retlist
End Function
Function ShuffleArray:Object[](array:Object[],sortfunc(array:Object[],ascending%,comparefunc(o1:Object,o2:Object))=MergeSortArray,comparefunc(o1:Object,o2:Object)=_Array_CompareObjects)
Local nodes:ShuffleNode[]=New ShuffleNode[array.length]
Local listindex%=0
For Local obj:Object=EachIn array
nodes[listindex]=New shufflenode
nodes[listindex].value=obj
listindex:+1
Next
sortfunc(nodes,1,comparefunc)
Local retarray:Object[]=New Object[array.length]
For Local index%=0 Until nodes.length
retarray[index]=nodes[index].value
Next
Return retarray
End Function
Type ShuffleNode
Field value:Object
Field num!=Rnd()
Method compare%(obj:Object)
Local node:ShuffleNode=ShuffleNode(obj)
If num>node.num Return 1
Return -1
End Method
End Type |
Comments
None.
Code Archives Forum