C语言实现二分查找(普通实现+递归实现)
二分查找主要过程:
#include<stdio.h> #include<stdlib.h> typedef struct List { int* data; int length; int size; }List; List* initList(int length) { List* list = (List*)malloc(sizeof(List)); list->data = (int*)malloc(sizeof(int) * length); list->length = length; list->size = 0; return list; } void listAdd(List* list, int data) { list->data[list->size] = data; list->size++; } void PrintList(List* list) { for (int i = 0; i < list->size; i++) { printf("%d ", list->data[i]); } printf(" "); } int BinarySearch(int key, List* list) { int start = 0; int end = list->size - 1; int mid; while (start <= end) { mid = (start + end) / 2; if (list->data[mid] == key) { return mid; } else if (list->data[mid] > key) { end = mid - 1; } else { start = mid + 1; } } return -1; } int BinarySearchRecursion(List* list, int key,int start,int end) { int mid = (start + end) / 2; if (start == end && list->data[start] != key) { return -1; } //if (start == end) //{ // if (list->data[start] == key) // { // return start; // } // else // { // return -1; // } //} if (list->data[mid] == key) { return mid; } else if (list->data[mid] < key) { return BinarySearchRecursion(list, key, mid + 1, end); } else { return BinarySearchRecursion(list, key, start, mid - 1); } } int main() { List* list = initList(9); for (int i = 1; i <=9; i++) { listAdd(list, i); } PrintList(list); /*int ret = BinarySearch(5,list); printf("%d ", ret);*/ printf("data %d in %d ",7, BinarySearch(7, list)); printf("data %d in %d ",10, BinarySearch(10, list)); printf("data %d in %d ",1, BinarySearch(1, list)); printf("data %d in %d ",3, BinarySearch(3, list)); printf("data %d in %d ", 7, BinarySearchRecursion(list,7,0,9)); printf("data %d in %d ", 10, BinarySearchRecursion(list, 10, 0, 9)); printf("data %d in %d ", 1, BinarySearchRecursion(list, 1, 0, 9)); printf("data %d in %d ", 3, BinarySearchRecursion(list, 3, 0, 9)); system("pause"); return 0; }
测试结果:
数组实现版:
#include<stdio.h> #include<stdlib.h> int Search(int arr[],int length, int key) { int mid = (length - 1 + 0) / 2; int start = 0; int end = length - 1; while (start <= end ) { mid = (start + end) / 2; if (arr[mid] == key) { return mid; } else if(arr[mid]<key) { start = mid+1; } else { end = mid-1; } } return -1; } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10}; int ret = Search(arr, 10, 6); printf("%d ", ret); system("pause"); return 0; }
测试结果:
下一篇:
贪心算法之——线段覆盖问题