归并排序(mergeSort) 与 分而治之策略(divide and conquer)

来源:互联网 发布:机关办公平台软件 编辑:程序博客网 时间:2024/06/07 18:01

1.  分治: (divide and conquer) 一个大的问题,可以分解为相似的子问题,每个相似的子问题都和原问题有一样的求解方法。可以将问题细化,直到子问题足够小能够求解,然后将子问题的解逐级合并,以最终求得原问题的解。


2. 归并排序算法的递归实现。


#include <stdio.h>#include <stdlib.h>#define max 100int tmp[max];void printArray(int* a, int len);void merge(int* a, int low, int mid, int high);void mergeSort(int *a, int low, int high);int main(int argc, char* argv[]){    int a[10] = {5, 4, 3, 2, 1, 3, 3, 3, 4, 0};    int len = 10;    mergeSort(a, 0, len-1);    printArray(a, len);    return 0;}void printArray(int* a, int len) {    int i;    for(i=0; i<len; i++) {        printf("%d\t", a[i]);    }    printf("\n");}void merge(int* a, int low, int mid, int high) {    int i;    int j;    int k;    for(i=low; i<=high; i++) {        tmp[i] = a[i];    }    j=low;    k=mid+1;    for(i=low; i<=high && j<=mid && k<=high; ) {        if(tmp[j]<=tmp[k]) {            a[i++] = tmp[j++];        }else{            a[i++] = tmp[k++];        }    }    while(j<=mid) a[i++] = tmp[j++];    while(k<=high) a[i++] = tmp[k++];}void mergeSort(int* a, int low, int high) {    int mid;    if(low<high) {        mid = (low+high) >> 1;        mergeSort(a, low, mid);        mergeSort(a, mid+1, high);        merge(a, low, mid, high);    }}


3.  插入排序、和归并排序的变体可以用来求数组的逆序数,前者o(n^2)  后者o(nlgn)..


以上参见《算法导论》的第二章。



原创粉丝点击