二分查找主要过程:
#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("\n");
}
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\n",7, BinarySearch(7, list));
printf("data %d in %d\n",10, BinarySearch(10, list));
printf("data %d in %d\n",1, BinarySearch(1, list));
printf("data %d in %d\n",3, BinarySearch(3, list));
printf("data %d in %d\n", 7, BinarySearchRecursion(list,7,0,9));
printf("data %d in %d\n", 10, BinarySearchRecursion(list, 10, 0, 9));
printf("data %d in %d\n", 1, BinarySearchRecursion(list, 1, 0, 9));
printf("data %d in %d\n", 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;
}
测试结果: