关于搜索,二分必提 /* **如果数组中存在多个key,返回随机的那个key下标,如找不到返回-1 **数组由小到大排列 **版本1:递归二分搜索 */ int binary_search1(int* array, int begin, int end, int key) { if(begin > end) return -1; int mid = (begin+end)/2; if(array[mid] == key) return mid; else if(array[mid] > key) return binary_search1(array, begin, mid-1, key); else if(array[mid] < key) return binary_search1(array, mid+1, end, key); } /* **如果数组中存在多个key,返回随机的那个key下标,如找不到返回-1 **数组由小到大排列 **版本2:非递归二分搜索 */ int binary_search2(int* array, int begin, int end, int key) { while(begin <= end) { int mid = (begin+end)/2; if(array[mid] == key) return mid; else if(array[mid] > key) end = mid - 1; else if(array[mid] < key) begin = mid + 1; } return -1; } /* **如果数组中存在多个key,返回下标最小的那个key,如找不到返回-1 **数组由小到大排列 **版本3:二分搜索(返回下标最小的那个key) */ int binary_search3(int* array, int begin, int end, int key) { while(begin < end) { int mid = (begin+end)/2; if(array[mid] == key) end = mid; else if(array[mid] > key) end = mid - 1; else if(array[mid] < key) begin = mid + 1; } if(array[begin] == key) return begin; else return -1; } /* **如果数组中存在多个key,返回下标最小的那个key,如找不到返回-1 **数组由小到大排列 **版本4:二分搜索(返回下标最小的那个key) **比版本3而言,优化了比较次数 */ int binary_search4(int* array, int len, int key) { int u = len; int l = -1; /*Start: 假象两个数array[l]与array[u] Assert: array[l] < key && array[u] >= key && u >= 0**/ while(l + 1 != u) { int mid = (l + u) / 2; if(array[mid] >= key) u = mid; else l = mid; } /*Out: array[u] >= key && array[l] < key && l + 1 == u**/ int index = u; if(index >= len || array[index] != key) return -1; return index; } int main() { int array[] = {3,3,3,3}; int len = sizeof(array)/sizeof(int); //int index = binary_search3(array, 0, len-1, 3); int index = binary_search4(array, len, 3); printf("Find index is : %d/n", index ); system("pause"); return 0; }