现在的位置: 首页 > 综合 > 正文

归并排序(C语言)

2014年06月07日 ⁄ 综合 ⁄ 共 772字 ⁄ 字号 评论关闭

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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;
}

抱歉!评论已关闭.