c语言假设有一组无序关键字序列(39,11,68,46,75,23,71,8,86,34],请设计折半查找算法查找某一关 键字key.(注意需要先排序)
时间: 2024-03-02 15:54:38 浏览: 62
好的,那么在使用折半查找算法进行查找之前,需要先对给定的无序关键字序列进行排序。可以使用快速排序算法对序列进行排序,然后再使用折半查找算法进行查找。以下是实现这个过程的C语言代码:
```c
#include <stdio.h>
// 快速排序函数
void quick_sort(int arr[], int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right, pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
// 折半查找函数
int binary_search(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {39, 11, 68, 46, 75, 23, 71, 8, 86, 34};
int n = sizeof(arr) / sizeof(int);
int target = 46;
// 先排序
quick_sort(arr, 0, n - 1);
// 再查找
int index = binary_search(arr, n, target);
if (index >= 0) {
printf("Found at index %d\n", index);
} else {
printf("Not found\n");
}
return 0;
}
```
在上述代码中,我们首先定义了一个快速排序函数 `quick_sort`,该函数接受一个整型数组 `arr`,以及待排序区间的左右端点 `left` 和 `right`。该函数使用经典的快速排序算法对数组进行排序,然后再定义了一个折半查找函数 `binary_search`,该函数接受一个已经有序的整型数组 `arr`、数组长度 `n` 和待查找的关键字 `target`,使用折半查找算法进行查找,返回该关键字在数组中的下标(从0开始),如果找不到则返回 `-1`。在主函数中,我们将待查找的关键字设为 `46`,先调用 `quick_sort` 函数对数组进行排序,然后再调用 `binary_search` 函数进行查找。如果返回值大于等于0,则说明查找成功,打印出该关键字在数组中的下标;否则说明查找失败,打印出提示信息。
阅读全文