算法课作业2.5(寻找L<x<U在排好序的数组A中)

算法书的作业题:

2.5 设A是n个不同的数排好序的数组,给定L和U, L<U,设计一个算法找到A中满足L<x<U的所有的x。

利用分治的方法可以在O(lgn)的时间内找到起始下标和终止下标。

  1 //
  2 //  main.cpp
  3 //  tests
  4 //
  5 //  Created by zanglei on 13-9-29.
  6 //  Copyright (c) 2013年 zanglei. All rights reserved.
  7 //
  8 
  9 #include <iostream>
 10 #include <cstdio>
 11 #include <cstdlib>
 12 #include <string>
 13 #include <vector>
 14 #include <cassert>
 15 using namespace std;
 16 
 17 #define MAX 100
 18 int result[MAX], len = 0;
 19 
 20 int lower = -1, higher = -1;
 21 
 22 void lower_index(int *a, int start, int end, int l, int u)
 23 {
 24     //find the lower.
 25     if (start > end)
 26         return;
 27     else if (start == end)
 28     {
 29         if (a[start] > l)
 30             lower = start;
 31         return;
 32     }
 33     int mid = (start + end) / 2;
 34     if (a[mid] == l)
 35     {
 36         lower = mid + 1;
 37         return;
 38     }
 39     else if (a[mid] < l)
 40     {
 41         lower_index(a, mid + 1, end, l, u);
 42         return;
 43     }
 44     else
 45     {
 46         lower_index(a, start, mid, l, u);
 47         return;
 48     }
 49 }
 50 
 51 void higher_index(int *a, int start, int end, int l, int u)
 52 {
 53     //cout << start << " " << end << " " << endl;
 54     //find the higher.
 55     if (start > end)
 56         return;
 57     else if (start == end)
 58     {
 59         if (a[start] < u)
 60             higher = start;
 61         return;
 62     }
 63     int mid = (start + end) / 2 + 1;
 64     if (a[mid] == u)
 65     {
 66         higher = mid - 1;
 67         return;
 68     }
 69     else if (a[mid] < u)
 70     {
 71         higher_index(a, mid, end, l, u);
 72         return;
 73     }
 74     else
 75     {
 76         higher_index(a, start, mid - 1, l, u);
 77         return;
 78     }
 79 }
 80 void cal(int *a, int start, int end, int l, int u)
 81 {
 82     if (start <= end)
 83     {
 84         int mid = (start + end) / 2;
 85         if (u <= a[mid])
 86         {
 87             cal(a, start, mid - 1, l, u);
 88             return;
 89         }
 90         else if (l >= a[mid])
 91         {
 92             cal(a, mid + 1, end, l, u);
 93             return;
 94         }
 95         else
 96         {
 97             result[len++] = a[mid];
 98             cal(a, start, mid - 1, l, u);
 99             cal(a, mid + 1, end, l, u);
100             return;
101         }
102     }
103 }
104 
105 
106 int main(int argc, const char * argv[])
107 {
108     int a[] = {1, 2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10};
109     cal(a, 0, sizeof(a) / sizeof(int) - 1, 2, 8);
110     for (int i = 0; i < len; i++) {
111         cout << result[i] << " ";
112     }
113     cout << endl;
114     lower_index(a, 0, sizeof(a) / sizeof(int) - 1, -22, -8);
115     cout << lower << endl;
116     higher_index(a, 0, sizeof(a) / sizeof(int) - 1,-22, -8);
117      cout << higher << endl;
118     if (lower != -1 && higher != -1) {
119         for (int i = lower; i <= higher; i++) {
120             cout << a[i] << " ";
121         }
122         cout << endl;
123     }
124 
125     //cout << lower << " " << higher << endl;
126     return 0;
127 }

 

 

posted on 2013-10-03 16:15  leiatpku  阅读(1285)  评论(4编辑  收藏  举报