1.用分治法查找数组中元素的最大值和最小值; 2.用分治法实现归并排序;完整c语言代码
时间: 2024-10-19 16:15:26 浏览: 31
1. **分治查找最大值和最小值**:
分治法在这里是将数组分成两半,然后递归地在左右半部分寻找最大值和最小值。首先,取中间元素作为基准,将数组分为两段。如果目标值在左边部分,就只在左半部分递归查找;反之,在右半部分查找。当搜索到只剩一个元素时,就找到了所求范围内的最大值或最小值。
```c
int findMaxMin(int arr[], int low, int high, int *max, int *min) {
if (low == high) { // 基本情况:只有一个元素
*max = arr[low];
*min = arr[low];
return 0;
}
int mid = low + (high - low) / 2; // 中间位置
int leftMax = findMaxMin(arr, low, mid, max, min); // 左半部分
int leftMin = findMaxMin(arr, low, mid, max, min); // 左半部分
// 更新最大值和最小值
if (arr[mid] > *max)
*max = arr[mid];
if (arr[mid] < *min)
*min = arr[mid];
return 1; // 继续递归查找另一半
}
int main() {
int arr[] = {5, 2, 9, 1, 7};
int max, min;
findMaxMin(arr, 0, sizeof(arr)/sizeof(arr[0]) - 1, &max, &min);
printf("Max value: %d, Min value: %d", max, min);
return 0;
}
```
2. **分治实现归并排序**:
归并排序也是分治策略的典型应用,它将数组分为两半,分别排序,然后合并两个有序部分。这里是一个基本的C语言实现:
```c
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l + (r - l) / 2; // 计算中间索引
mergeSort(arr, l, m); // 对左半部分排序
mergeSort(arr, m+1, r); // 对右半部分排序
merge(arr, l, m, r); // 合并两个部分
}
}
void merge(int arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2]; // 临时存储数组
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0; j = 0; k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j])
arr[k++] = L[i++];
else
arr[k++] = R[j++];
}
// 将剩余元素复制回原数组
while (i < n1)
arr[k++] = L[i++];
while (j < n2)
arr[k++] = R[j++];
}
int main() {
int arr[] = {5, 2, 9, 1, 7};
int size = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, size - 1);
return 0;
}
```
阅读全文