#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define max 10
void merge_sort(int a[], int p, int r);
void merge(int a[], int p, int q, int r);
int main() {
int array[max];
int i;
srand((unsigned)time(NULL));
for (i = 0; i < max; i++) {
array[i] = rand() % 90 + 10;
}
printf("unsorted array: ");
for (i = 0; i < max; i++) {
printf("%d ", array[i]);
}
printf("\n");
merge_sort(array, 0, 9);
for (i = 0; i < max; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
void merge(int a[], int p, int q, int r) {
int i, j, k, n1, n2;
int *front, *back;
n1 = q - p + 1;
n2 = r - q;
front = (int *)malloc(n1 * sizeof(int));
back = (int *)malloc(n2 * sizeof(int));//申请两个动态内存空间
for (i = 0; i < n1; i++) {
front[i] = a[p + i];
}
for (i = 0; i < n2; i++) {
back[i] = a[q + i + 1];
}
i = 0;
j = 0;
k = p;
while (i < n1 && j < n2) {
if (front[i] < back[j]) {
a[k++] = front[i++];
} else {
a[k++] = back[j++];
}
}
while (i < n1) {
a[k++] = front[i++];
}
while (j < n2) {
a[k++] = back[j++];
}
}
void merge_sort(int a[], int p, int r) {
int q;
if (p < r) {
q = (p + r) / 2;
merge_sort(a, p, q);
merge_sort(a, q + 1, r);
merge(a, p, q, r);
}
}
归并模型!
void merge(int a[], int p, int q, int r) {
int i, j, k, n1, n2;
int *front, *back;
n1 = q - p + 1;
n2 = r - q;
front = (int *)malloc(n1 * sizeof(int));
back = (int *)malloc(n2 * sizeof(int));//申请两个动态内存空间
for (i = 0; i < n1; i++) {
front[i] = a[p + i];
}
for (i = 0; i < n2; i++) {
back[i] = a[q + i + 1];
}
i = 0;
j = 0;
k = p;
while (i < n1 && j < n2) {
if (front[i] < back[j]) {
a[k++] = front[i++];
} else {
a[k++] = back[j++];
}
}
while (i < n1) {
a[k++] = front[i++];
}
while (j < n2) {
a[k++] = back[j++];
}
}
void merge_sort(int a[], int p, int r) {
int q;
if (p < r) {
q = (p + r) / 2;
merge_sort(a, p, q);
merge_sort(a, q + 1, r);
merge(a, p, q, r);
}
}
运用分治的思想,时间复杂度始终为o(nlogn)