排序八之合并排序

来源:互联网 发布:如何用java编写计算器 编辑:程序博客网 时间:2024/06/14 04:02

Merge Sort

合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称其为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来实现多路合并排序。

合并排序的基本流程如下:

1:首先将含有n个节点的待排序数据序列看作n个长度为一的有序子表组成,并将它们两两合并,得到长度为二的若干有序子表;

2:然后,在对这些子表进行两两合并,得到长度为四的若干有序子表,……

3:重复上述过程,直到最后子表的长度为n,从而完成排序过程。

#include<stdio.h>#include<stdlib.h>#include<time.h>#define SIZE 15void MergeOne(int a[],int b[],int n,int l){    int i,j;    int k,s,e;    s=0;    while(s+l<n)    {        e=s+2*l-1;        if(e>=n)         e=n-1;         k=s;         i=s;         j=s+l;         while(i<s+l&&j<=e)         {             if(a[i]<=a[j])                b[k++]=a[i++];             else                b[k++]=a[j++];         }         while(i<s+l)          b[k++]=a[i++];          while(j<=e)            b[k++]=a[j++];          s=e+1;    }    if(s<n)    {        for(;s<n;s++)        {            b[s]=a[s];        }    }}void MergeSort(int a[],int n){    int *p;    int h,l,f;    f=0;    l=1;    if(!(p=(int *)malloc(sizeof(int)*n)))    {        printf("内存分配失败!\n");        exit(0);    }    while(l<n)    {        if(f==1)            MergeOne(p,a,n,l);        else           MergeOne(a,p,n,l);        l=l*2;        f=1-f;    }    if(f)    {        for(h=0;h<n;h++)            a[h]=p[h];    }    free(p);}int main(){    int i;    int shuzu[SIZE];    srand(time(NULL));    for(i=0;i<SIZE;i++)        shuzu[i]=rand()/1000+100;    printf("排序后的数组为:\n");    for(i=0;i<SIZE;i++)        printf("%d ",shuzu[i]);    printf("\n");    MergeSort(shuzu,SIZE);    printf("排序后的数组为:\n");    for(i=0;i<SIZE;i++)        printf("%d ",shuzu[i]);    printf("\n");    return 0;}

0 0
原创粉丝点击