分别使用蛮力法分治法减一法和减半法去找出数组中的最大值并统计关键字比较次数c语言包含主函数
时间: 2023-08-13 12:05:32 浏览: 103
好的,以下是使用C语言实现四种算法寻找数组最大值的代码,包含主函数以及统计关键字比较次数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 蛮力法
int max_brute(int arr[], int n, int *count) {
int max = arr[0];
for (int i = 1; i < n; i++) {
(*count)++;
if (arr[i] > max)
max = arr[i];
}
return max;
}
// 分治法
int max_divide(int arr[], int l, int r, int *count) {
if (l == r) return arr[l];
int mid = (l + r) / 2;
int max_left = max_divide(arr, l, mid, count);
int max_right = max_divide(arr, mid + 1, r, count);
(*count) += 2;
return max_left > max_right ? max_left : max_right;
}
// 减一法
int max_sub1(int arr[], int n, int *count) {
int max = arr[0];
for (int i = 1; i < n; i += 2) {
(*count)++;
if (arr[i] > arr[i - 1]) {
(*count)++;
if (arr[i] > max)
max = arr[i];
} else {
(*count)++;
if (arr[i - 1] > max)
max = arr[i - 1];
}
}
if (n % 2 != 0) {
(*count)++;
if (arr[n - 1] > max)
max = arr[n - 1];
}
return max;
}
// 减半法
int max_halve(int arr[], int n, int *count) {
int max = arr[0];
int left = 0, right = n - 1;
while (left <= right) {
(*count)++;
if (left == right) {
(*count)++;
if (arr[left] > max)
max = arr[left];
break;
}
(*count)++;
if (arr[left] > arr[right]) {
(*count)++;
if (arr[left] > max)
max = arr[left];
left++;
} else {
(*count)++;
if (arr[right] > max)
max = arr[right];
right--;
}
}
return max;
}
int main() {
srand(time(NULL)); // 用时间戳初始化随机数生成器
int n = 100; // 数组长度
int arr[n];
for (int i = 0; i < n; i++) {
arr[i] = rand() % 1000; // 生成0~999之间的随机整数
}
// 蛮力法
int count_brute = 0;
int max_brute_val = max_brute(arr, n, &count_brute);
printf("蛮力法:最大值为%d,比较次数为%d\n", max_brute_val, count_brute);
// 分治法
int count_divide = 0;
int max_divide_val = max_divide(arr, 0, n - 1, &count_divide);
printf("分治法:最大值为%d,比较次数为%d\n", max_divide_val, count_divide);
// 减一法
int count_sub1 = 0;
int max_sub1_val = max_sub1(arr, n, &count_sub1);
printf("减一法:最大值为%d,比较次数为%d\n", max_sub1_val, count_sub1);
// 减半法
int count_halve = 0;
int max_halve_val = max_halve(arr, n, &count_halve);
printf("减半法:最大值为%d,比较次数为%d\n", max_halve_val, count_halve);
return 0;
}
```
这个代码实现了四种算法,其中每种算法都有一个计数器来统计比较次数。主函数中首先随机生成一个长度为n的数组,然后依次调用四种算法,并输出每种算法的最大值和比较次数。
阅读全文