歸並排序採用分治策略:
#include <stdlib.h>
#include <malloc.h>
void merge(int src[], int des[], int low, int high, int mid) {
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high) {
des[k++] = (src[i] < src[j]) ? src[i++] : src[j++];
}
while (i <= mid) des[k++] = src[i++];
while (j <= high) des[k++] = src[j++];
}
void MSort(int src[], int des[], int low, int high, int max_size) {
if (low == high) {
des[low] = src[low];
} else {
int mid = (low + high) / 2;
int* tmp = (int*)malloc(sizeof(int) * max_size);
if (tmp) {
MSort(src, tmp, low, mid, max_size);
MSort(src, tmp, mid + 1, high, max_size);
merge(tmp, des, low, high, mid);
free(tmp);
}
}
}
void Merge_Sort(int arr[], int low, int high, int len) {
MSort(arr, arr, low, high, len);
}
int main(void) {
int arr[10];
for (int i = 0; i < 10; i++) arr[i] = rand() % 100;
printf("Before: "); for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
Merge_Sort(arr, 0, 9, 10);
printf("\nAfter: "); for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
return 0;
}
Before: 41 67 34 0 69 24 78 58 62 64 After: 0 24 34 41 58 62 64 67 69 78