讀《演算法導論》我來C語言實現(2)——合并排序

來源:互聯網
上載者:User

    書上講的第二個演算法是合并排序,採用了分治法的思想,合并法遵照了分治模式,在每一層遞迴上都有三個步驟:

    分解:將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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.