归并排序

说归并排序稳定是因为它是一种稳定的排序方法。(快速排序和堆排序都是不稳定的排序方法)

说归并排序内外兼修是因为它在内部排序和外部排序中都需要用到。

归并,英文是Merge。归并排序,是Merge Sort。

“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。

假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌌n/2⌍个长度为2或1的有序子序列;再两两归并…如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。

2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。

归并排序的源代码:

#include<unistd.h>
#include<stdio.h>
#include<string.h>
 
void merge(int *arr,int *sarr,int i,int m,int n) //将arr[i..m]和arr[m+1,n]归并为有序的sarr[i..n]
{
        int j,k,index;
        for(j=m+1,k=i;i<=m&&j<=n;k++){
                if(arr[i]<=arr[j])
                        sarr[k]=arr[i++];
                else
                        sarr[k]=arr[j++];
        }
        if(i<=m){
                for(index=i;index<=m;index++)
                        sarr[k++]=arr[index];
        }
        if(j<=n){
                for(index=j;index<=n;index++)
                        sarr[k++]=arr[index];
        }
}
 
void Merge_sort(int *arr,int *sarr,int s,int t) //将arr[s..t]归并排序为sarr[s..t]
{
        int m;
        int sarr2[10]={0};
        if(s==t)
                sarr[s]=arr[s];
        else{
                m=(s+t)/2; //将arr[s..t]平分为arr[s..m]和arr[m+1,t]
                Merge_sort(arr,sarr2,s,m); //递归地将SR[s..m]归并为有序的sarr2[s..m]
                Merge_sort(arr,sarr2,m+1,t); //递归地将arr[m+1..t]归并为有序的sarr2[s..t]
                merge(sarr2,sarr,s,m,t); //将sarr2[s..m]和sarr2[m+1..t]归并到sarr[s..t]
        }
}
 
int main(int argc,char *argv[])
{
        printf("Quick Sort:/n");
        int arr[10]={0,4,2,5,1,8,7,9};
        int sarr[10]={0};
        int arrsize=7;
        Merge_sort(arr,sarr,1,arrsize); //进行归并排序
        int i;
        printf("Sorted array: ");
        for(i=1;i<=arrsize;i++){
                printf("%d ",sarr[i]);
        }
        printf("/n");
        return 0;
}

over~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值