写程序,将一数组中的数按从小到大排序,然后输入一个数,要求用折半查找法找出该数,是数组中第几个元素值。如果该数不在数组中,则打印出“无此数”用c语言用简单的方法
时间: 2024-12-19 16:21:45 浏览: 7
有15个数按小由到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标
在C语言中,你可以按照以下步骤编写程序来实现这个功能:
1. **数组排序**:
首先,你需要对输入的整数数组进行排序。这里我们假设你已经有一个未排序的整数数组`arr[]`和其长度`n`,可以使用标准库函数`qsort()`来进行快速排序,或者自己手动实现冒泡、选择等排序算法。
```c
#include <stdio.h>
#include <stdlib.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition (int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
```
2. **折半查找**(二分查找):
排序完成后,你可以使用二分查找算法在已排序的数组中找到目标值的位置。二分查找需要数组已经是有序的,每次比较中间元素,如果目标大于中间元素,就在右侧继续查找;反之,在左侧查找。直到找到目标或者搜索范围为空。
```c
int binarySearch(int arr[], int l, int r, int x) {
while (l <= r) {
int m = l + (r - l) / 2;
if (arr[m] == x)
return m;
if (arr[m] < x)
l = m + 1;
else
r = m -1
return -1;
}
```
3. **完整程序示例**:
将上述两部分合并,用户输入数组并进行排序后查找目标值。
```c
int main() {
int n, target;
printf("Enter the number of elements in the array: ");
scanf("%d", &n);
int arr[n];
printf("Enter the elements of the array: ");
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quickSort(arr, 0, n - 1);
printf("Enter a number to search: ");
scanf("%d", &target);
int index = binarySearch(arr, 0, n - 1, target);
if (index != -1)
printf("Number %d is at position %d.\n", target, index + 1);
else
printf("No such number.\n");
return 0;
}
```
阅读全文