2. 设计分治法实现二路归并排序。 利用递归思想,实现自上向下的二路归并排序。 使用c
时间: 2024-12-12 11:32:12 浏览: 9
在C语言中,我们可以使用分治策略来实现二路归并排序。以下是递归版的二路归并排序算法步骤:
1. **分解**(Divide):将待排序数组分成两个相等的部分。这里可以取中间索引,将数组分为两半。
2. **求解**(Conquer):对这两部分分别进行递归的归并排序。
3. **合并**(Combine):当两个部分排序完成后,将它们合并成一个有序的整体。这一步很重要,需要创建一个新的临时数组,并按照比较大小顺序把两边的元素依次放入。
4. **回溯**(Combine Backward):递归调用结束后,返回合并后的数组作为结果。
下面是一个简单的C语言版本的二路归并排序函数示例:
```c
void mergeSort(int arr[], int left, int right) {
if (left < right) {
// 分割数组
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid); // 对左半部分进行排序
mergeSort(arr, mid+1, right); // 对右半部分进行排序
// 合并排序好的部分
int i = left; // 左指针
int j = mid + 1; // 右指针
int k = left; // 临时数组起始位置
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
arr[k++] = arr[i++];
} else {
arr[k++] = arr[j++];
}
}
// 将剩余未放完的部分复制到临时数组
while (i <= mid) {
arr[k++] = arr[i++];
}
while (j <= right) {
arr[k++] = arr[j++];
}
}
}
// 主函数调用
int main() {
int arr[] = {9, 7, 5, 11, 12, 2, 14, 3};
int n = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, n - 1);
// 输出排序后的数组
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
阅读全文