#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool merge(int array[], int arrStart, int mid, int arrEnd) {
int arrLen = arrEnd - arrStart;
if (arrLen < 2) {
return false;
}
int *temp = (int *)malloc(arrLen * sizeof(int));
int i = arrStart;
int j = mid;
int tempIndex = 0;
while (i < mid && j < arrEnd) {
if (array[i] > array[j]) {
temp[tempIndex] = array[j++];
} else {
temp[tempIndex] = array[i++];
}
++tempIndex;
}
while (i < mid) {
temp[tempIndex++] = array[i++];
}
while (j < arrEnd) {
temp[tempIndex++] = array[j++];
}
for ((tempIndex = 0, i = arrStart); (tempIndex < arrLen && i < arrEnd); (++tempIndex, ++i)) {
array[i] = temp[tempIndex];
}
free(temp);
temp = NULL;
}
bool mergeSort(int array[], int arrStart, int arrEnd) {
int arrLen = arrEnd - arrStart;
if (arrLen < 0) {
printf("请重新输入!");
return false;
}
if (arrLen == 0 || arrLen == 1) {
return true;
}
int middle = arrStart + arrLen / 2;
mergeSort(array, arrStart, middle);
mergeSort(array, middle, arrEnd);
return merge(array, arrStart, middle, arrEnd);
}
void printArray(int array[], int arrLen) {
for (int i = 0; i < arrLen; ++i) {
printf("%d ", array[i]);
}
printf("\n");
}
int main() {
int array0[] = {49,38,65,97,76,13,27};
int arrayLen = sizeof(array0) / sizeof(int);
printf("归并排序前:");
printArray(array0, arrayLen);
mergeSort(array0, 0, arrayLen);
printf("归并排序后:");
printArray(array0, arrayLen);
printf("=========================================\n");
int array1[] = {20,23,11,5,21,33};
int arrayLen1 = sizeof(array1) / sizeof(int);
printf("归并排序前:");
printArray(array1, arrayLen1);
mergeSort(array1, 0, arrayLen1);
printf("归并排序后:");
printArray(array1, arrayLen1);
}