随机给出10个数,现在用折半查找法比较10个数的大小对他们由小到大进行排序,输出排序结果,用数组不用指针的C语言
时间: 2024-09-27 18:14:53 浏览: 40
java 折半查找法(二分查找)实例
5星 · 资源好评率100%
在C语言中,如果我们想通过折半查找的方式对数组进行排序,实际上这不是折半查找算法的主要用途,因为折半查找主要是用于在一个有序数组中快速定位某个元素。然而,你可以结合其他排序算法,如插入排序,来达到这个目的。这里我们可以先用折半查找找出数组中的最小元素,然后将其放到正确的位置,接着继续查找剩下未排序部分的最小元素,直到整个数组排序完成。这是一种“折半查找+插入排序”的组合方式。
以下是具体的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 插入排序
void insertion_sort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
// 折半查找,仅用于找到未排序部分的最小值
int binary_search_min(int arr[], int left, int right) {
if (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] < arr[mid + 1])
return mid;
else if (arr[mid] < arr[left])
return binary_search_min(arr, left, mid - 1);
else
return binary_search_min(arr, mid + 1, right);
}
return left;
}
int main() {
int size = 10;
int* arr = malloc(size * sizeof(int));
// 生成随机数
srand(time(0));
for (int i = 0; i < size; i++)
arr[i] = rand() % 100; // 示例中随机生成0到99之间的数
printf("Original array:\n");
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
// 通过折半查找+插入排序排序
int index = binary_search_min(arr, 0, size - 1);
int temp = arr[0];
arr[0] = arr[index];
arr[index] = temp;
insertion_sort(arr + 1, size - 1); // 排序剩余部分
printf("\nSorted array using half search and insertion sort:\n");
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
free(arr);
return 0;
}
```
阅读全文