merge sort

来源:互联网 发布:lamp一键安装包centos 编辑:程序博客网 时间:2024/05/22 04:27
//Merge sort BY ZHAODW#include<stdio.h>#define N 10#define SENTINEL 1000int source[N] = {1,9,2,8,3,7,4,6,5,10};int L[N] = {0};int R[N] = {0};int merge(int* s,int p,int q,int r){if(p == q)    return 0;if(q - p > 1){    int pre = p + (r - p) / 2;    int aft = r + (q - r + 1) / 2;    merge(s,p,r,pre);    merge(s,r+1,q,aft);}int i = p;for(;i <= r;i++ )    L[i-p] = s[i];L[i - p] = SENTINEL;i = r + 1;for(;i <= q;i++)    R[i - r - 1] = s[i];R[i -r -1] = SENTINEL;i = 0;int j = 0;int k = p;for(;k <= q;k++){    if(L[i] <= R[j])    {s[k] = L[i];i++;    }    else    {s[k] = R[j];        j++;    }}return 0;}int main(){    int p = 0,q = N - 1;    int r = p + (q - p) / 2;    merge(source,p,q,r);    int i = 0;    for(;i < N;i++)printf("%d ",source[i]);    printf("\n");    return 0;}

merge sort 源码

递归式为

T(n) = 2T(n/2) + O(n)

于是根据主方法,合并排序的时间复杂度为

O(nlgn)

合并排序没有最好和最差情况,同时需要额外的空间辅助排序

注意合并时候的哨兵 SENTINEL :)

解决递归式复杂度的主方法接下来介绍



原创粉丝点击