利用分治法求一组数据中最大的两个数和最小的两个数c语言
时间: 2024-11-14 16:23:31 浏览: 1
求一组数组的两个最大值和两个最小值 分治法
4星 · 用户满意度95%
在C语言中,利用分治法解决寻找数组中最大和最小值的问题通常涉及到选择排序的一个变种,例如“荷兰国旗”算法(Dutch National Flag Problem),也称为分而治之的思想。这里我们可以创建三个指针,分别代表小于、等于和大于当前元素的位置。逐步遍历数组,将元素放入正确的区域:
```c
void findMinMax(int arr[], int n, int *min, int *max) {
if (n <= 1) {
// 基础情况:只有一个元素或没有元素
if (n == 1) {
*min = arr[0];
*max = arr[0];
} else {
*min = INT_MAX;
*max = INT_MIN; // 初始化为最大和最小整数值
}
return;
}
int left = 0, equal = 0, right = n - 1;
while (left < right) {
// 如果左边指针指向的元素小于右边,向右移动最小值指针
if (arr[left] < arr[right]) {
arr[left + 1] = arr[left]; // 移动小元素到一边
left++;
} else {
// 否则,如果左边指针大于等于,移动最大值指针
arr[right - 1] = arr[right];
right--;
}
}
// 左边指针现在就是最大值位置,右边是剩余部分的第一个元素(最小值)
*max = arr[left];
*min = arr[right];
// 如果有相等的元素,可以在数组的一端再找一个
if (equal > 0 && arr[left - 1] == arr[right]) {
*min = min(arr[left - 1], arr[right + 1]);
}
}
// 示例用法
int main() {
int arr[] = {5, 3, 8, 6, 2, 9};
int min, max;
findMinMax(arr, sizeof(arr) / sizeof(arr[0]), &min, &max);
printf("最小值: %d, 最大值: %d\n", min, max);
return 0;
}
```
阅读全文