二分搜索算法
//源代码如下:
#include<stdio.h>
#include<stdlib.h>
//二分搜索算法
int BinarySearch(int a[],int n,int x) {
int left = 0, right = n - 1;
while (right >= left) {
int middle = (right + left) / 2;
if (a[middle] == x)
return middle;
if (a[middle] < x)
left = middle + 1;
else
right = middle - 1;
}
return -1;
}
// 快速排序的分区函数
int Partition(int a[], int begin, int end) {
int pivot = a[end];
int i = (begin - 1);
for (int j = begin; j < end; j++) {
if (a[j] <= pivot) {
i++;
// Swap a[i] and a[j]
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
// Swap a[i+1] and a[end] (or pivot)
int temp = a[i + 1];
a[i + 1] = a[end];
a[end] = temp;
return i + 1;
}
// 快速排序算法
void QuickSort(int a[], int begin, int end) {
if (begin < end) {
int partitionIndex = Partition(a, begin, end);
QuickSort(a, begin, partitionIndex - 1);
QuickSort(a, partitionIndex + 1, end);
}
}
int main()
{
int a[100]; // 假设数组最大长度为100,可以根据需要调整
int n, x, i;
// 输入数组的长度
printf("输入数组的长度:");
scanf("%d", &n);
// 检查数组长度是否超过预定义的最大长度
if (n > 100) {
printf("数组长度超出预定义的最大值。\n");
return 1;
}
// 输入数组的每个元素
printf("输入数组的%d个元素:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 对数组进行快速排序
QuickSort(a, 0, n - 1);
// 验证二分搜索函数的正确性
// int a[6] = {1,3,6,8,9,12};
// int n = 6;
// int x;
// 输入要查找的数
printf("输入你要查找的数:");
scanf("%d", &x);
// 执行二分搜索
int result = BinarySearch(a, n, x);
if (result != -1)
printf("查找成功,要查找的数的下标为%d\n", result+1);
else
printf("查找失败\n");
// system("pause");
return 0;
}
算法分析:
利用了快速排序算法:
上述源代码实现了以下几点
1,可以自己定义输入
2,可以不按顺序输入
3,时间复杂度依旧是O(nlogn)