排序算法之归并排序

来源:互联网 发布:杭州软件开发招聘 编辑:程序博客网 时间:2024/05/27 03:28

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并方法:1、将n个记录看成是n个长度为一的有序子表。
2、将两两相邻的有序子表进行归并。
3、重复2步骤,直到归并成长度为n的有序表。

#include<stdio.h>#define N 10void merge(int r[],int s[],int x1,int x2,int x3){    int i,j,k;    i=x1;                       //第一部分开始位置    j=x2+1;                     //第二部分开始位置    k=x1;    while((i<=x2)&&(j<=x3))     //当i和j都在要合并的部分中时        if(r[i]<=r[j])          //筛选两部分中较小的元素放到数组s中    {        s[k]=r[i];        i++;        k++;    }    else    {        s[k]=r[j];        j++;        k++;    }    while(i<=x2)                //将x1~x2范围内未比较的数顺次加到数组r中        s[k++]=r[i++];    while(j<=x3)        s[k++]=r[j++];          //将x2+1~x3范围内未比较的数顺次加到数组r中}void merge_sort(int r[],int s[],int m,int n){    int p;    int t[20];    if(m==n)        s[m]=r[m];    else    {        p=(m+n)/2;        merge_sort(r,t,m,p);    //将r[m]~r[p]归并成有序的t[m]~t[p]        merge_sort(r,t,p+1,n);  //将r[p+1]~r[n]归并成有序的t[p+1]~t[n]        merge(t,s,m,p,n);       //将前两部分归并到s[m]~s[n]    }}int main(){    int a[N+1],i;    printf("请输入10个数:\n");    for(i=1;i<=N;i++)        scanf("%d",&a[i]);    printf("这10数的顺序是:\n");    for(i=1;i<=N;i++)        printf("%5d",a[i]);    printf("\n排序后10个数的顺序是:\n");    merge_sort(a,a,1,N);    for(i=1;i<=N;i++)        printf("%5d",a[i]);    return 0;}
原创粉丝点击