使用折半查找写一份代码
时间: 2024-02-20 20:58:50 浏览: 61
好的,下面是使用折半查找在 Python 中实现的代码:
```python
def binary_search(arr, target):
"""
在有序数组 arr 中查找目标元素 target,返回其索引位置,若不存在则返回 -1
"""
left, right = 0, len(arr) - 1 # 初始化查找区间
while left <= right:
mid = (left + right) // 2 # 中间位置
if arr[mid] == target:
return mid # 查找成功,返回索引位置
elif arr[mid] < target:
left = mid + 1 # 目标元素在右半部分,更新查找区间
else:
right = mid - 1 # 目标元素在左半部分,更新查找区间
return -1 # 查找失败,返回 -1
```
这个函数接收一个有序数组 `arr` 和目标元素 `target` 作为输入,返回目标元素在数组中的索引位置,如果不存在则返回 -1。实现中使用了双指针法来维护查找区间,每次取中间位置进行比较,根据比较结果更新查找区间,直到找到目标元素或者确定目标元素不存在。
相关问题
写出可以使用其完整功能的折半查找代码
好的,以下是一份完整的折半查找代码,包括了输入、排序和输出:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
int binarySearch(int a[], int n, int x) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] == x) {
return mid;
} else if (a[mid] > x) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1; // 查找失败
}
int main() {
int n, x;
cout << "请输入数组长度n和要查找的数x:" << endl;
cin >> n >> x;
int a[n];
cout << "请输入" << n << "个数:" << endl;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n); // 排序
int index = binarySearch(a, n, x);
if (index == -1) {
cout << "查找失败" << endl;
} else {
cout << "要查找的数x在数组中的下标为:" << index << endl;
}
return 0;
}
```
运行示例:
```
请输入数组长度n和要查找的数x:
5 3
请输入5个数:
5 3 8 1 9
要查找的数x在数组中的下标为:1
```
希望能帮到你,如有疑问请随时问我!
帮我写一份c++的折半排序和测试代码
### 回答1:
好的,以下是C语言的折半排序代码和测试代码:
```c
#include <stdio.h>
void binaryInsertionSort(int arr[], int n) {
int i, j, left, right, mid, key;
for (i = 1; i < n; i++) {
key = arr[i];
left = 0;
right = i - 1;
while (left <= right) {
mid = (left + right) / 2;
if (key < arr[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
arr[left] = key;
}
}
int main() {
int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
int n = sizeof(arr) / sizeof(arr[0]);
int i;
printf("原始数组为: ");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
binaryInsertionSort(arr, n);
printf("\n排序后数组为: ");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
这里我们实现了一个折半排序的函数 `binaryInsertionSort()`,它可以对整数数组进行排序。该函数的时间复杂度为 O(nlogn)。
在 `main()` 函数中,我们创建了一个整数数组 `arr`,并调用 `binaryInsertionSort()` 函数对其进行排序。最后,我们打印出原始数组和排序后的数组,以便于检查排序是否成功。
请注意,这只是一个简单的示例代码,仅用于演示折半排序的实现方式。在实际应用中,您可能需要根据具体的需求进行更改和优化。
### 回答2:
折半排序(Binary Insertion Sort)是一种插入排序的变种算法,它可以在有序数组中快速查找到插入元素的位置,从而保持数组始终有序。以下是一个用 C 语言编写的折半排序和测试代码:
```
#include <stdio.h>
// 折半排序函数
void binaryInsertionSort(int array[], int n) {
int i, j, insertValue, low, high, mid;
for (i = 1; i < n; i++) {
insertValue = array[i]; // 获取当前需要插入的元素
low = 0;
high = i - 1;
// 使用折半查找法确定插入位置
while (low <= high) {
mid = (low + high) / 2;
if (insertValue < array[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
// 将大于插入元素的所有元素右移一位
for (j = i - 1; j >= low; j--) {
array[j + 1] = array[j];
}
array[low] = insertValue; // 将插入元素放置到正确的位置
}
}
// 测试函数
void testBinaryInsertionSort() {
int i;
int array[] = {7, 5, 1, 9, 3};
int n = sizeof(array) / sizeof(array[0]);
printf("原始数组:");
for (i = 0; i < n; i++) {
printf("%d ", array[i]);
}
binaryInsertionSort(array, n); // 使用折半排序算法对数组进行排序
printf("\n排序后的数组:");
for (i = 0; i < n; i++) {
printf("%d ", array[i]);
}
}
int main() {
testBinaryInsertionSort(); // 调用测试函数
return 0;
}
```
以上代码中,`binaryInsertionSort` 函数实现了折半排序算法,`testBinaryInsertionSort` 函数则用于测试排序算法的正确性。在 `main` 函数中,我们调用 `testBinaryInsertionSort` 函数执行测试。运行代码后,会输出原始数组和排序后的数组,以验证折半排序算法的正确性。
### 回答3:
折半排序(Binary Insertion Sort)是一种插入排序算法,其原理是将待排序的元素依次插入已经排好序的部分中,通过不断比较并移动元素的方法完成排序。
以下是用C语言编写的折半排序和测试代码:
```c
#include <stdio.h>
// 折半插入排序函数
void binaryInsertionSort(int arr[], int n) {
int i, j, left, right, middle, temp;
for (i = 1; i < n; i++) {
temp = arr[i];
left = 0;
right = i - 1;
// 使用二分查找找到插入位置
while (left <= right) {
middle = (left + right) / 2;
if (arr[middle] > temp) {
right = middle - 1;
} else {
left = middle + 1;
}
}
// 将插入位置右边的元素后移
for (j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
// 插入元素到正确位置
arr[left] = temp;
}
}
// 测试代码
int main() {
int arr[] = {9, 5, 2, 7, 1, 8, 6, 3, 4};
int n = sizeof(arr) / sizeof(arr[0]);
int i;
printf("原始数组:");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 调用折半插入排序算法
binaryInsertionSort(arr, n);
printf("排序后的数组:");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
以上代码实现了折半排序算法,并测试了排序结果。原始数组为{9, 5, 2, 7, 1, 8, 6, 3, 4},排序后的数组为{1, 2, 3, 4, 5, 6, 7, 8, 9}。
阅读全文