- 算法说明
归并排序粗暴的将待排数据分成两块,分别排序,对每一部分在分成两部分,直到分成一个数再直接返回,最后逐级合并。
- 源代码
#include <cstdio>
void Merge(int p1[],int q1, int p2[], int q2, int a[]) {
int i = 0, j = 0, k = 0;
while(i < q1 && j < q2) {
if(p1[i] < p2[j]) {
a[k++] = p1[i];
i++;
} else {
a[k++] = p2[j];
j++;
}
}
if(i == q1) {
for(i = j; i < q2; i++) {
a[k++] = p2[i];
}
} else {
for(j = i; j < q1; j++) {
a[k++] = p1[j];
}
}
}
void MergeSort(int a[], int n) {
if(n == 1) return;
int mid = n / 2;
int *p1 = new int[mid + 1], *p2 = new int[mid + 1];
for(int i = 0; i < mid; i++) p1[i] = a[i];
for(int i = 0; i < n - mid; i++) p2[i] = a[i + mid];
MergeSort(p1, mid);
MergeSort(p2, n - mid);
Merge(p1, mid, p2, n - mid, a);
}
int main() {
int a[10] = {1, 4, 5, 7, 8, 9, 0, 3, 2, 6}, n = 10;
MergeSort(a, n);
for(int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
return 0;
}
- 运行结果