归并排序

来源:互联网 发布:排课系统算法 编辑:程序博客网 时间:2024/05/01 10:55
#include <stdio.h>#include <stdlib.h>#define INFINITY 0xffff// p <= q < rvoid Merge(int *A, int p, int q, int r){int m = q - p + 1; // m >= 1int n = r - q;     // n >= 1int *L = (int *)malloc((m + 1) * sizeof(int)); int *R = (int *)malloc((n + 1) * sizeof(int));for (int i = 0; i < m; i++)L[i] = A[p + i];for (int j = 0; j < n; j++)R[j] = A[q + 1 + j];L[m] = INFINITY; // 设置一个哨兵,简化了比较R[n] = INFINITY;int i = 0;int j = 0;for (int k = p; k <= r; k++) {if (L[i] <= R[j]) {A[k] = L[i++];} else {A[k] = R[j++];} }free(L);free(R);}void Merge1(int *A, int p, int q, int r){int m = q - p + 1; // m >= 1int n = r - q;     // n >= 1int *L = (int *)malloc(m * sizeof(int)); int *R = (int *)malloc(n * sizeof(int));for (int i = 0; i < m; i++)L[i] = A[p + i];for (int j = 0; j < n; j++)R[j] = A[q + 1 + j];int i = 0;int j = 0;int k = p;while (i < m && j < n) {if (L[i] <= R[j]) {A[k++] = L[i++];} else {A[k++] = R[j++];}} while (i < m) { A[k++] = L[i++];}while (j < n) {A[k++] = R[j++];}free(L);free(R);}void MergeSort(int *arr, int p, int r){if (p < r) {int q = (p + r) / 2;MergeSort(arr, p, q);MergeSort(arr, q + 1, r);Merge1(arr, p, q, r);}}

0 0
原创粉丝点击