合并法排序(Merge Sort)是一种基于分治思想的排序算法,其原理如下:
1.将待排序数组分成两个子数组,每个子数组包含大约相等数量的元素。
2.递归地对子数组进行排序,直到每个子数组的大小为1。
3.将已排序的子数组合并成一个新的排序数组,合并过程中按照从小到大的顺序逐个比较两个子数组中的元素,并将较小的元素放入新数组中,直到所有元素都被放入新数组中。
4.最终得到一个有序数组。
合并排序的时间复杂度是O(nlogn),其中n是待排序数组的长度。它的空间复杂度是O(n)。由于它采用了递归的思想,所以其实现过程相对简单,且不受数据类型限制,可以适用于各种类型的数据排序。
一、C 实现合并法排序及代码详解
合并排序(Merge Sort)是一种稳定、时间复杂度为 O(nlogn) 的排序算法。
其基本思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将这些有序的子序列合并成一个有序的序列。
具体实现分为两个步骤:
-
分割(Divide):将待排序的序列从中间分成两部分,递归地对左半部分和右半部分分别进行归并排序,直到序列中只有一个元素。
-
合并(Merge):将两个有序子序列合并成一个有序序列,称之为归并。
下面是 C 语言实现合并排序的完整代码及详细分析:
#include <stdio.h>
void Merge(int arr[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
// 创建临时数组
int L[n1], R[n2];
// 将数据拷贝到临时数组 L 和 R
for (i = 0; i < n1; i++) L[i] = arr[left + i];
for (j = 0; j < n2; j++) R[j] = arr[mid + 1 + j];
i = 0; // 左侧数组的索引
j = 0; // 右侧数组的索引
k = left; // 合并数组的索引
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
// 将剩余的元素拷贝到合并数组中
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void MergeSort(int arr[]