归并排序问题
归并排序算法是成功应用分治法的一个完美的例子,其基本思想是将待排序元素分成大小大致相同的两个子序列,分别对这两个子序列进行排序,最终将排好序的子序列合并为所要求的序列。归并排序算法按照分治法的3个步骤进行:
(1)分解。将n个元素分成各含n/2个元素的子序列。
(2)求解。用归并排序对两个子序列递归地排序。
(3)合并。合并两个已经排好序的子序列以得到最终排序结果。
下面附上C语言代码:
#include <stdio.h>
#include <sched.h>
void Merge(int A[], int p, int q, int r) {
int i, j, k;
int L[50], R[50];
int n1 = q - p + 1, n2 = r - q;
for (i = 0; i < n1; i ++ ) {
L[i] = A[p + i];
}
for (j = 0; j < n2; j ++ ) {
R[j] = A[q + j + 1];
}
L[n1] = INT_MAX;
R[n2] = INT_MAX;
i = 0;
j = 0;
for (k = p; k < r + 1; k ++ ) {
if (L[i] < R[j]) {
A[k] = L[i];
i ++ ;
} else {
A[k] = R[j];
j ++ ;
}
}
}
void MergeSort(int A[], int p, int r) {
int q;
if (p < r) {
q = (p + r) / 2;
MergeSort(A, p, q);
MergeSort(A, q + 1, r);
Merge(A, p, q, r);
}
}
int main() {
int A[] = {4, 1, 3, 6, 8, 5, 2, 9};
MergeSort(A, 0, 7);
int i;
for (i = 0; i < 8; i ++ ) {
printf("%d ", A[i]);
}
return 0;
}