算法书的作业题:
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 }