書上講的第二個演算法是合并排序,採用了分治法的思想,合并法遵照了分治模式,在每一層遞迴上都有三個步驟:
分解:將n個元素分成各含n/2個元素的子序列
解決:用合并排序對兩個子序列遞迴地排序
合并:合并兩個已排序的子序列以得到排序的結果
在對子序列排序時,其長度為1時遞迴結束。單個元素被視為是已排好序的。
其C語言實現如下:
#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <limits.h>void merge(int *A, unsigned int p, unsigned int q, unsigned int r){unsigned int i, j, k;//前半段為A[p..q], 後半段為A[q+1..r]int *L = (int *)malloc((q - p + 1 + 1) * sizeof(int)); //q-p+1為前半段元素的個數,外加額外的一個哨兵int *R = (int *)malloc((r - q + 1) * sizeof(int)); //r-q為後半段元素的個數,外加額外的一個哨兵assert((L != NULL) && (R != NULL));for (i = 0; i < q - p + 1; i++){L[i] = A[p + i];}for (j = 0; j < r - q; j++){R[j] = A[q + 1 + j];}L[q - p + 1] = INT_MAX;R[r - q] = INT_MAX;i = j = 0;for (k = p; k <= r; k++){if (L[i] <= R[j]){A[k] = L[i];i++;}else{A[k] = R[j];j++;}}free(L);free(R);}void merge_sort(int *A, unsigned int p, unsigned int r){if (p < r){unsigned int q = (r + p) / 2;merge_sort(A, p, q);merge_sort(A, q + 1, r);merge(A, p, q, r);}}int main(){int array[] = {5, 10, 2, 3, 9, -1, 3};int i;merge_sort(array, 0, sizeof(array) / sizeof(int) - 1);for (i = 0; i < sizeof(array) / sizeof(int); i++){printf("%d ", array[i]);}return 0;}