changeset 322:fb54a3af9c86

Add sort method to arrays
author Michael Pavone <pavone@retrodev.com>
date Sun, 22 Mar 2015 22:06:50 -0700
parents 3edd0169311a
children eb5f1fca9b78
files modules/array.tp samples/sort.tp
diffstat 2 files changed, 76 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/modules/array.tp	Sun Mar 22 19:10:32 2015 -0700
+++ b/modules/array.tp	Sun Mar 22 22:06:50 2015 -0700
@@ -129,6 +129,66 @@
 		}
 		ret
 	}
+	
+	sort <- {
+		n <- length
+		tmp <- #[]
+		tmp resize: n
+		while: { (tmp length) < n} do: {
+			tmp append: false
+		}
+		src <- self
+		dst <- tmp
+		
+		merge <- :lStart rStart rEnd {
+			dstIdx <- lStart
+			left <- lStart
+			right <- rStart
+			
+			while: { dstIdx < rEnd } do: {
+				if: left < rStart && (right >= rEnd || (src get: left) <= (src get: right)) {
+					dst set: dstIdx (src get: left)
+					left <- left + 1
+				} else: {
+					dst set: dstIdx (src get: right)
+					right <- right + 1
+				}
+				dstIdx <- dstIdx + 1
+			}
+		}
+		
+		needsCopy? <- false
+		subSize <- 1
+		while: { subSize < n} do: {
+			group <- subSize * 2
+			i <- 0
+			while: { i < n} do: {
+				right <- i + subSize
+				end <- i + group
+				if: right > n {
+					right <- n
+					end <- n
+				} else: {
+					if: end > n {
+						end <- n
+					}
+				}
+				merge: i right end
+				i <- i + group
+			}
+			tmp <- dst
+			dst <- src
+			src <- tmp
+			needsCopy? <- not: needsCopy?
+		
+			subSize <- subSize + subSize
+		}
+		if: needsCopy? {
+			foreach: src :index val {
+				self set: index val
+			}
+		}
+	}
 
 	join <- :sep {
 		if: length > 0 {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/sort.tp	Sun Mar 22 22:06:50 2015 -0700
@@ -0,0 +1,16 @@
+#{
+	main <- {
+		a <- #[1 2 3 4 5 6 7 8 9]
+		b <- #[9 8 7 6 5 4 3 2 1]
+		c <- #[1 3 5 7 9 2 4 6 8 10]
+		d <- #[10 8 6 4 2 9 7 5 3 1]
+		a sort
+		print: (a join: " ") . "\n"
+		b sort
+		print: (b join: " ") . "\n"
+		c sort
+		print: (c join: " ") . "\n"
+		d sort
+		print: (d join: " ") . "\n"
+	}
+}
\ No newline at end of file