changeset 1387:f78531791439

[project @ 1995-09-14 06:57:58 by jwe]
author jwe
date Thu, 14 Sep 1995 06:57:58 +0000
parents 588cad732153
children 32ede420188c
files src/sort.cc
diffstat 1 files changed, 134 insertions(+), 361 deletions(-) [+]
line wrap: on
line diff
--- a/src/sort.cc	Thu Sep 14 05:55:59 1995 +0000
+++ b/src/sort.cc	Thu Sep 14 06:57:58 1995 +0000
@@ -36,6 +36,122 @@
 // XXX FIXME XXX -- there is way too much duplicated code here given
 // that the sort algorithms are all the same, and only the type of the
 // data and the comparison changes...
+//
+// Maybe some cpp abuse will make it better.
+
+static Array<int>
+create_index_array (int n)
+{
+  Array<int> l (n+1);
+
+  l.elem (0) = 1;
+
+  for (int i = 1; i < n - 1; i++)
+    l.elem (i) = -(i+2);
+
+  l.elem (n-1) = 0;
+  l.elem (n) = 0;
+  l.elem (n+1) = 2;
+
+  return l;
+}
+
+#define SORT_INIT_PHASE(n) \
+  int s = 0; \
+  int t = n + 1; \
+  int p = l.elem (s); \
+  int q = l.elem (t); \
+  if (q == 0) \
+     break
+
+#define SORT_COMMON_CODE \
+  p = -p; \
+  q = -q; \
+  if (q == 0) \
+    { \
+      l.elem (s) = (l.elem (s) < 0) \
+	? ((p < 0) ? p : -p) \
+	  : ((p >= 0) ? p : -p); \
+      l.elem (t) = 0; \
+      break; \
+    } \
+
+#define SORT_REORDER_PHASE_ONE \
+  l.elem (s) = (l.elem (s) < 0) \
+    ? ((q < 0) ? q : -q) \
+      : ((q >= 0) ? q : -q); \
+  s = q; \
+  q = l.elem (q); \
+  if (q <= 0) \
+    { \
+      l.elem (s) = p; \
+      s = t; \
+      do \
+	{ \
+	  t = p; \
+	  p = l.elem (p); \
+	} \
+      while (p > 0); \
+      SORT_COMMON_CODE; \
+    } \
+
+#define SORT_REORDER_PHASE_TWO \
+  l.elem (s) = (l.elem (s) < 0) \
+    ? ((p < 0) ? p : -p) \
+      : ((p >= 0) ? p : -p); \
+  s = p; \
+  p = l.elem (p); \
+  if (p <= 0) \
+    { \
+      l.elem (s) = q; \
+      s = t; \
+      do \
+	{ \
+	  t = q; \
+	  q = l.elem (q); \
+	} \
+      while (q > 0); \
+      SORT_COMMON_CODE; \
+    }
+
+#define DO_SORT(n, condition) \
+  while (1) \
+    { \
+      SORT_INIT_PHASE(n); \
+      while (1) \
+	{ \
+	  if (condition) \
+	    { \
+	      SORT_REORDER_PHASE_ONE; \
+	    } \
+	  else \
+	    { \
+	      SORT_REORDER_PHASE_TWO; \
+	    } \
+	} \
+    }
+
+#define VECTOR_CREATE_RETURN_VALUES(vs, v) \
+  int k = l.elem (0); \
+  idx.elem (0) = k; \
+  vs.elem (0) = v.elem (k-1); \
+  for (int i = 1; i < n; i++) \
+    { \
+      k = l.elem ((int) idx.elem (i-1)); \
+      idx.elem (i) = k; \
+      vs.elem (i) = v.elem (k-1); \
+    }
+
+#define MATRIX_CREATE_RETURN_VALUES(ms, m) \
+  int k = l.elem (0); \
+  idx.elem (0, j) = k; \
+  ms.elem (0, j) = m.elem (k-1, j); \
+  for (int i = 1; i < nr; i++) \
+    { \
+      k = l.elem ((int) idx.elem (i-1, j)); \
+      idx.elem (i, j) = k; \
+      ms.elem (i, j) = m.elem (k-1, j); \
+    }
 
 static Octave_object
 mx_sort (const Matrix& m)
@@ -52,97 +168,11 @@
     {
       for (int j = 0; j < nc; j++)
 	{
-	  Array<int> l (nr+2);
-
-	  l (0) = 1;
-	  for (int i = 1; i < nr - 1; i++)
-	    l (i) = -(i+2);
-	  l (nr-1) = 0;
-	  l (nr) = 0;
-	  l (nr+1) = 2;
-
-	  while (1)
-	    {
-	      int s = 0;
-	      int t = nr + 1;
-	      int p = l (s);
-	      int q = l (t);
-
-	      if (q == 0)
-		break;
+	  Array<int> l = create_index_array (nr);
 
-	      while (1)
-		{
-		  if (m (p-1, j) > m (q-1, j))
-		    {
-		      l (s) = (l (s) < 0)
-			? ((q < 0) ? q : -q)
-			  : ((q >= 0) ? q : -q);
-		      s = q;
-		      q = l (q);
-		      if (q <= 0)
-			{
-			  l (s) = p;
-			  s = t;
-			  do
-			    {
-			      t = p;
-			      p = l (p);
-			    }
-			  while (p > 0);
-			  p = -p;
-			  q = -q;
-			  if (q == 0)
-			    {
-			      l (s) = (l (s) < 0)
-				? ((p < 0) ? p : -p)
-				  : ((p >= 0) ? p : -p);
-			      l (t) = 0;
-			      break;
-			    }
-			}
-		    }
-		  else
-		    {
-		      l (s) = (l (s) < 0)
-			? ((p < 0) ? p : -p)
-			  : ((p >= 0) ? p : -p);
-		      s = p;
-		      p = l (p);
-		      if (p <= 0)
-			{
-			  l (s) = q;
-			  s = t;
-			  do
-			    {
-			      t = q;
-			      q = l (q);
-			    }
-			  while (q > 0);
-			  p = -p;
-			  q = -q;
-			  if (q == 0)
-			    {
-			      l (s) = (l (s) < 0)
-				? ((p < 0) ? p : -p)
-				  : ((p >= 0) ? p : -p);
-			      l (t) = 0;
-			      break;
-			    }		      
-			}
-		    }
-		}
-	    }
+	  DO_SORT (nr, (m.elem (p-1, j) > m.elem (q-1, j)));
 
-	  int k = l (0);
-	  idx (0, j) = k;
-	  ms (0, j) = m (k-1, j);
-	  for (int i = 1; i < nr; i++)
-	    {
-	      k = l ((int) idx (i-1, j));
-	      idx (i, j) = k;
-	      ms (i, j) = m (k-1, j);
-	    }
+	  MATRIX_CREATE_RETURN_VALUES (ms, m);
 	}
     }
 
@@ -164,97 +194,11 @@
 
   if (n > 0)
     {
-      Array<int> l (n+2);
-
-      l (0) = 1;
-      for (int i = 1; i < n - 1; i++)
-	l (i) = -(i+2);
-      l (n-1) = 0;
-      l (n) = 0;
-      l (n+1) = 2;
-
-      while (1)
-	{
-	  int s = 0;
-	  int t = n + 1;
-	  int p = l (s);
-	  int q = l (t);
-
-	  if (q == 0)
-	    break;
+      Array<int> l = create_index_array (n);
 
-	  while (1)
-	    {
-	      if (v (p-1) > v (q-1))
-		{
-		  l (s) = (l (s) < 0)
-		    ? ((q < 0) ? q : -q)
-		      : ((q >= 0) ? q : -q);
-		  s = q;
-		  q = l (q);
-		  if (q <= 0)
-		    {
-		      l (s) = p;
-		      s = t;
-		      do
-			{
-			  t = p;
-			  p = l (p);
-			}
-		      while (p > 0);
-		      p = -p;
-		      q = -q;
-		      if (q == 0)
-			{
-			  l (s) = (l (s) < 0)
-			    ? ((p < 0) ? p : -p)
-			      : ((p >= 0) ? p : -p);
-			  l (t) = 0;
-			  break;
-			}
-		    }
-		}
-	      else
-		{
-		  l (s) = (l (s) < 0)
-		    ? ((p < 0) ? p : -p)
-		      : ((p >= 0) ? p : -p);
-		  s = p;
-		  p = l (p);
-		  if (p <= 0)
-		    {
-		      l (s) = q;
-		      s = t;
-		      do
-			{
-			  t = q;
-			  q = l (q);
-			}
-		      while (q > 0);
-		      p = -p;
-		      q = -q;
-		      if (q == 0)
-			{
-			  l (s) = (l (s) < 0)
-			    ? ((p < 0) ? p : -p)
-			      : ((p >= 0) ? p : -p);
-			  l (t) = 0;
-			  break;
-			}		      
-		    }
-		}
-	    }
-	}
+      DO_SORT (n, (v.elem (p-1) > v.elem (q-1)));
 
-      int k = l (0);
-      idx (0) = k;
-      vs (0) = v (k-1);
-      for (int i = 1; i < n; i++)
-	{
-	  k = l ((int) idx (i-1));
-	  idx (i) = k;
-	  vs (i) = v (k-1);
-	}
+      VECTOR_CREATE_RETURN_VALUES (vs, v);
     }
 
   retval (1) = tree_constant (idx, 0);
@@ -278,107 +222,21 @@
     {
       for (int j = 0; j < nc; j++)
 	{
-	  Array<int> l (nr+2);
-
-	  l (0) = 1;
-	  for (int i = 1; i < nr - 1; i++)
-	    l (i) = -(i+2);
-	  l (nr-1) = 0;
-	  l (nr) = 0;
-	  l (nr+1) = 2;
+	  Array<int> l = create_index_array (nr);
 
 	  int all_elts_real = 1;
 	  for (int i = 0; i < nr; i++)
-	    if (imag (cm (i, j)) != 0.0)
+	    if (imag (cm.elem (i, j)) != 0.0)
 	      {
 		all_elts_real = 0;
 		break;
 	      }
 
-	  while (1)
-	    {
-	      int s = 0;
-	      int t = nr + 1;
-	      int p = l (s);
-	      int q = l (t);
-
-	      if (q == 0)
-		break;
+	  DO_SORT (nr, ((all_elts_real
+			 && real (cm.elem (p-1, j)) > real (cm.elem (q-1, j)))
+			|| abs (cm.elem (p-1, j)) > abs (cm.elem (q-1, j))));
 
-	      while (1)
-		{
-		  if ((all_elts_real
-		       && real (cm (p-1, j)) > real (cm (q-1, j)))
-		      || abs (cm (p-1, j)) > abs (cm (q-1, j)))
-		    {
-		      l (s) = (l (s) < 0)
-			? ((q < 0) ? q : -q)
-			  : ((q >= 0) ? q : -q);
-		      s = q;
-		      q = l (q);
-		      if (q <= 0)
-			{
-			  l (s) = p;
-			  s = t;
-			  do
-			    {
-			      t = p;
-			      p = l (p);
-			    }
-			  while (p > 0);
-			  p = -p;
-			  q = -q;
-			  if (q == 0)
-			    {
-			      l (s) = (l (s) < 0)
-				? ((p < 0) ? p : -p)
-				  : ((p >= 0) ? p : -p);
-			      l (t) = 0;
-			      break;
-			    }
-			}
-		    }
-		  else
-		    {
-		      l (s) = (l (s) < 0)
-			? ((p < 0) ? p : -p)
-			  : ((p >= 0) ? p : -p);
-		      s = p;
-		      p = l (p);
-		      if (p <= 0)
-			{
-			  l (s) = q;
-			  s = t;
-			  do
-			    {
-			      t = q;
-			      q = l (q);
-			    }
-			  while (q > 0);
-			  p = -p;
-			  q = -q;
-			  if (q == 0)
-			    {
-			      l (s) = (l (s) < 0)
-				? ((p < 0) ? p : -p)
-				  : ((p >= 0) ? p : -p);
-			      l (t) = 0;
-			      break;
-			    }		      
-			}
-		    }
-		}
-	    }
-
-	  int k = l (0);
-	  idx (0, j) = k;
-	  cms (0, j) = cm (k-1, j);
-	  for (int i = 1; i < nr; i++)
-	    {
-	      k = l ((int) idx (i-1, j));
-	      idx (i, j) = k;
-	      cms (i, j) = cm (k-1, j);
-	    }
+	  MATRIX_CREATE_RETURN_VALUES (cms, cm);
 	}
     }
 
@@ -400,106 +258,21 @@
 
   if (n > 0)
     {
-      Array<int> l (n+2);
-
-      l (0) = 1;
-      for (int i = 1; i < n - 1; i++)
-	l (i) = -(i+2);
-      l (n-1) = 0;
-      l (n) = 0;
-      l (n+1) = 2;
+      Array<int> l = create_index_array (n);
 
       int all_elts_real = 1;
       for (int i = 0; i < n; i++)
-	if (imag (cv (i)) != 0.0)
+	if (imag (cv.elem (i)) != 0.0)
 	  {
 	    all_elts_real = 0;
 	    break;
 	  }
 
-      while (1)
-	{
-	  int s = 0;
-	  int t = n + 1;
-	  int p = l (s);
-	  int q = l (t);
-
-	  if (q == 0)
-	    break;
+      DO_SORT (n, ((all_elts_real
+		    && real (cv.elem (p-1)) > real (cv.elem (q-1)))
+		   || abs (cv.elem (p-1)) > abs (cv.elem (q-1))));
 
-	  while (1)
-	    {
-	      if ((all_elts_real && real (cv (p-1)) > real (cv (q-1)))
-		  || abs (cv (p-1)) > abs (cv (q-1)))
-		{
-		  l (s) = (l (s) < 0)
-		    ? ((q < 0) ? q : -q)
-		      : ((q >= 0) ? q : -q);
-		  s = q;
-		  q = l (q);
-		  if (q <= 0)
-		    {
-		      l (s) = p;
-		      s = t;
-		      do
-			{
-			  t = p;
-			  p = l (p);
-			}
-		      while (p > 0);
-		      p = -p;
-		      q = -q;
-		      if (q == 0)
-			{
-			  l (s) = (l (s) < 0)
-			    ? ((p < 0) ? p : -p)
-			      : ((p >= 0) ? p : -p);
-			  l (t) = 0;
-			  break;
-			}
-		    }
-		}
-	      else
-		{
-		  l (s) = (l (s) < 0)
-		    ? ((p < 0) ? p : -p)
-		      : ((p >= 0) ? p : -p);
-		  s = p;
-		  p = l (p);
-		  if (p <= 0)
-		    {
-		      l (s) = q;
-		      s = t;
-		      do
-			{
-			  t = q;
-			  q = l (q);
-			}
-		      while (q > 0);
-		      p = -p;
-		      q = -q;
-		      if (q == 0)
-			{
-			  l (s) = (l (s) < 0)
-			    ? ((p < 0) ? p : -p)
-			      : ((p >= 0) ? p : -p);
-			  l (t) = 0;
-			  break;
-			}		      
-		    }
-		}
-	    }
-	}
-
-      int k = l (0);
-      idx (0) = k;
-      cvs (0) = cv (k-1);
-      for (int i = 1; i < n; i++)
-	{
-	  k = l ((int) idx (i-1));
-	  idx (i) = k;
-	  cvs (i) = cv (k-1);
-	}
+      VECTOR_CREATE_RETURN_VALUES (cvs, cv);
     }
 
   retval (1) = tree_constant (idx, 0);