归并排序(C语言)

来源:互联网 发布:无锡办公软件培训 编辑:程序博客网 时间:2024/06/05 22:58
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

算法描述
  归并操作的工作原理如下:
  申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  设定两个指针,最初位置分别为两个已经排序序列的起始位置
  比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  重复步骤3直到某一指针达到序列尾
  将另一序列剩下的所有元素直接复制到合并序列尾并成一个有序表,称为2-路归并。

#include <stdio.h>int a[13]= {6,2,3,4,1,7,9,8};
//对已经排好序的两个数组进行合并void mergerarry(int f,int m,int l){    int i=f,j=m+1,k=f,temp[13];    while(i<=m&&j<=l)    {        if(a[i]<a[j])            temp[k++]=a[i++];        else            temp[k++]=a[j++];    }    while(i<=m)        temp[k++]=a[i++];    while(j<=l)        temp[k++]=a[j++];    for(k=f; k<=l; k++)        a[k]=temp[k];}
//归并void mergersort(int f,int l){    if(f<l)    {        int mid=(f+l)/2;        mergersort(f,mid);        mergersort(mid+1,l);        mergerarry(f,mid,l);    }}int main(){    mergersort(0,7);    for(int i=0; i<8; i++)    {        printf("%d",a[i]);    }    return 0;}


原创粉丝点击