#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中元素复制到B for (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; }