#include <stdio.h>
#include <stdlib.h>
#define INFINITY 0xffff
// p <= q < r
void Merge(int *A, int p, int q, int r)
{
int m = q - p + 1; // m >= 1
int n = r - q; // n >= 1
int *L = (int *)malloc((m + 1) * sizeof(int));
int *R = (int *)malloc((n + 1) * sizeof(int));
for (int i = 0; i < m; i++)
L[i] = A[p + i];
for (int j = 0; j < n; j++)
R[j] = A[q + 1 + j];
L[m] = INFINITY; // 设置一个哨兵,简化了比较
R[n] = INFINITY;
int i = 0;
int j = 0;
for (int k = p; k <= r; k++) {
if (L[i] <= R[j]) {
A[k] = L[i++];
} else {
A[k] = R[j++];
}
}
free(L);
free(R);
}
void Merge1(int *A, int p, int q, int r)
{
int m = q - p + 1; // m >= 1
int n = r - q; // n >= 1
int *L = (int *)malloc(m * sizeof(int));
int *R = (int *)malloc(n * sizeof(int));
for (int i = 0; i < m; i++)
L[i] = A[p + i];
for (int j = 0; j < n; j++)
R[j] = A[q + 1 + j];
int i = 0;
int j = 0;
int k = p;
while (i < m && j < n) {
if (L[i] <= R[j]) {
A[k++] = L[i++];
} else {
A[k++] = R[j++];
}
}
while (i < m) {
A[k++] = L[i++];
}
while (j < n) {
A[k++] = R[j++];
}
free(L);
free(R);
}
void MergeSort(int *arr, int p, int r)
{
if (p < r) {
int q = (p + r) / 2;
MergeSort(arr, p, q);
MergeSort(arr, q + 1, r);
Merge1(arr, p, q, r);
}
}
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布