1、迭代实现二分查找
int b_s1(int t[], int i, int j, int s) { if(s < t[i] || s > t[j]) { return -1; } while(1) { if(i > j) { return -1; } int m = (i + j)/2; if(t[m] == s) { return m; } else if(t[m] < s) { i = m + 1; } else { j = m - 1; } } }
2、递归实现二分查找
int b_s(int t[], int i, int j, int s) { if(i > j) { return -1; } if(s < t[i] || s > t[j]) { return -1; } int m = (i + j)/2; if(t[m] == s) { return m; } else if(t[m] < s) { i = m + 1; } else { j = m - 1; } return b_s(t, i, j, s); }
3、习题之一,二分查找第一个出现的查找数据
int b_s2(int t[], int i, int j, int s) { int sch = -1; if(s < t[i] || s > t[j]) { return -1; } while(1) { if(i > j) { return sch; } int m = (i + j)/2; if(t[m] == s) { sch = m; j = m - 1; } else if(t[m] < s) { i = m + 1; } else { j = m - 1; } } }
4、完整程序,含测试部分
int b_s(int t[], int i, int j, int s) { if(i > j) { return -1; } if(s < t[i] || s > t[j]) { return -1; } int m = (i + j)/2; if(t[m] == s) { return m; } else if(t[m] < s) { i = m + 1; } else { j = m - 1; } return b_s(t, i, j, s); } int b_s1(int t[], int i, int j, int s) { if(s < t[i] || s > t[j]) { return -1; } while(1) { if(i > j) { return -1; } int m = (i + j)/2; if(t[m] == s) { return m; } else if(t[m] < s) { i = m + 1; } else { j = m - 1; } } } int b_s2(int t[], int i, int j, int s) { int sch = -1; if(s < t[i] || s > t[j]) { return -1; } while(1) { if(i > j) { return sch; } int m = (i + j)/2; if(t[m] == s) { sch = m; j = m - 1; } else if(t[m] < s) { i = m + 1; } else { j = m - 1; } } } int _tmain(int argc, _TCHAR* argv[]) { int t[10] ; for(int i = 0; i < 10; i++) { t[i] = i + 1; } int index = b_s(t, 0, 9, 5); index = b_s(t, 0, 9, 10); index = b_s(t, 0, 9, 10000); index = b_s(t, 0, 9, 0); index = b_s(t, 0, 9, -1); index = b_s1(t, 0, 9, 5); index = b_s1(t, 0, 9, 10); index = b_s1(t, 0, 9, 10000); index = b_s1(t, 0, 9, 0); index = b_s1(t, 0, 9, -1); index = b_s2(t, 0, 9, 5); index = b_s2(t, 0, 9, 10); index = b_s2(t, 0, 9, 10000); index = b_s2(t, 0, 9, 0); index = b_s2(t, 0, 9, -1); t[2] = 4; index = b_s2(t, 0, 9, 4); for(int i = 1; i < 9; i++) { t[i] = 5; } index = b_s2(t, 0, 9, 5); return 0; }
5、第七题
给定一个满足0<= x <= 1的点(x, y),查找包围这个点的两个线段,前提条件就是0 到 1之间,所有线段不相交,y值递增。
解题分支:
递增可以使用二分查找,直接找最后一个比指定点大的线段,这个线卡要么在最靠近这个点之上,要么这个点就在上面。找到后,索引-1,自然就是最靠近的下面的那个线段了。
#include<stdio.h> typedef struct point { int x; int y; }POINT; /*the up_index must be initialised as -1, or something else below the 0*/ void get_approximate_line_up_index(POINT *p, int low, int high, double d_x, double d_y, int &up_index ) { int m = 0; if(p[high].x * d_x + p[high].y < d_y) { return ; } if(p[low].x * d_x + p[low].y > d_y) { return ; } while(1) { if(low > high) { return; } m = (low + high) / 2; if(p[m].x * d_x + p[m].y < d_y) { low = m + 1; } else if(p[m].x * d_x + p[m].y > d_y) { up_index = m; high = m - 1; } else { up_index = m; return ; } } } void print_line_pair(int low, int high, int index) { int m_l = 0; int m_h = 0; if(low >= high) { printf("invalid input\n"); return; } if(index < low || index > high) { printf("no match pair\n"); return; } if(index == low) { m_l = low; m_h = high; } else { m_l = index - 1; m_h = index; } printf("macth pair is (low = %d, high = %d)\n", m_l, m_h); } int main() { POINT p[] = { { 1, 2}, { 2, 2}, { 3, 2}, { 4, 2}, { 5, 2}, { 6, 2}, { 7, 2}, { 8, 2}, { 9, 2}, { 10, 2}, { 11, 2}, }; int p_size = sizeof p/sizeof p[0]; /*find the (0.5, 3.1)*/ double x = 0.5; int up_index = -1; for(int index = 0; index < p_size; index++) { printf("(x, y) is (%lf, %lf) \n", x, p[index].x * x + p[index].y); } printf("\n\n"); get_approximate_line_up_index(p, 0, p_size - 1, x, 3.1, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 4.0, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 4.1, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 4.5, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 4.6, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 5.1, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 5.6, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 6.1, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 6.6, up_index); print_line_pair(0, p_size - 1, up_index); up_index = -1; get_approximate_line_up_index(p, 0, p_size - 1, x, 7.1, up_index); print_line_pair(0, p_size - 1, up_index); }