瀏覽代碼

v.to.db: bsearch cat

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@64659 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 10 年之前
父節點
當前提交
a903c2d2ca
共有 1 個文件被更改,包括 56 次插入13 次删除
  1. 56 13
      vector/v.to.db/find.c

+ 56 - 13
vector/v.to.db/find.c

@@ -2,30 +2,73 @@
 #include <string.h>
 #include  "global.h"
 
+
+static int bsearch_cat(int cat)
+{
+    int mid, lo, hi;
+    
+    if (vstat.rcat < 1)
+	return -1;
+
+    lo = 0;
+    hi = vstat.rcat - 1;
+    
+    if (hi == 0 || Values[lo].cat > cat || Values[hi].cat < cat)
+	return -1;
+
+    if (Values[hi].cat == cat)
+	return hi;
+
+    if (Values[lo].cat == cat)
+	return lo;
+
+    while (lo < hi) {
+	mid = (lo + hi) / 2;
+	
+	if (Values[mid].cat == cat)
+	    return mid;
+
+	if (Values[mid].cat > cat) {
+	    hi = mid;
+	}
+	else {
+	    lo = mid;
+	}
+    }
+    
+    return -1;
+}
+
 /* returns index to array of values, inserts new if necessary */
 int find_cat(int cat, int add)
 {
     int i;
 
-    for (i = 0; i < vstat.rcat; i++)
-	if (Values[i].cat == cat)
+    if ((i = bsearch_cat(cat)) >= 0)
 	    return i;
 
     if (!add)
 	return -1;
 
     /* Not found -> add new */
-    Values[vstat.rcat].cat = cat;
-    Values[vstat.rcat].count1 = 0;
-    Values[vstat.rcat].count1 = 0;
-    Values[vstat.rcat].i1 = -1;
-    Values[vstat.rcat].i2 = -1;
-    Values[vstat.rcat].d1 = 0.0;
-    Values[vstat.rcat].d2 = 0.0;
-    Values[vstat.rcat].qcat = NULL;
-    Values[vstat.rcat].nqcats = 0;
-    Values[vstat.rcat].aqcats = 0;
+    for (i = vstat.rcat; i > 0; i--) {
+	if (Values[i - 1].cat < cat)
+	    break;
+
+	Values[i] = Values[i - 1];
+    }
+    Values[i].cat = cat;
+    Values[i].count1 = 0;
+    Values[i].count1 = 0;
+    Values[i].i1 = -1;
+    Values[i].i2 = -1;
+    Values[i].d1 = 0.0;
+    Values[i].d2 = 0.0;
+    Values[i].qcat = NULL;
+    Values[i].nqcats = 0;
+    Values[i].aqcats = 0;
+
     vstat.rcat++;
 
-    return (vstat.rcat - 1);
+    return (i);
 }