#include <stdio.h>
#include <stdlib.h>
#include <string.h>int B[100];//归并排序
void Merge(int A[], int low, int mid, int high) {int i = low, j = mid + 1;int k;//将A中元素复制到Bfor (k = low; k <= high; ++k) {B[k] = A[k];}for (k = low; i <= mid && j <= high; k++)if (B[i] <= B[j]) {A[k] = B[i];i++;} else {A[k] = B[j];j++;}while (i <= mid) {A[k] = B[i];k++;i++;}while (j <= high) {A[k] = B[j];k++;j++;}
}void MergeSort(int A[], int low, int high) {if (low < high) {int mid = (low + high) / 2;MergeSort(A, low, mid);MergeSort(A, mid + 1, high);Merge(A, low, mid, high);}}//计数排序
void CountSort(int A[], int n) {
//找到数组的最大最小值int max = A[0];int min = A[0];for (int i = 1; i < n; i++) {if (max < A[i])max = A[i];if (min > A[i])min = A[i];}int k = max - min + 1;int *memory = (int *) malloc(sizeof(int) * k);memset(memory, 0, sizeof(int) * k);for (int i = 0; i < n; ++i) {memory[A[i] - min]++;}//构造累加数组for (int i = 1; i < k; i++) {memory[i] = memory[i] + memory[i - 1];}
//辅助输出数组int *C = malloc(sizeof(int) * n);for (int i = n - 1; i >= 0; i--) {memory[A[i]-min]--;C[memory[A[i]-min]]=A[i];}for (int i = 0; i < n; i++) {A[i] = C[i];}free(C);free(memory);}int main(void) {int A[] = {49, 38, 65, 97, 76, 13, 27};MergeSort(A, 0, 6);printf("归并排序");for (int i = 0; i < sizeof(A) / sizeof(A[0]); ++i) {printf("%d ", A[i]);}printf("\n");int A2[] = {4, 2, 2, -3, -5, 0, 3, 3, 1};CountSort(A2, 9);printf("计数排序");for (int i = 0; i < sizeof(A2) / sizeof(A2[0]); ++i) {printf("%d ", A2[i]);}return 0;
}