归并排序( 时间复杂度O(n*logn) )

归并排序( 时间复杂度O(n*logn) )

采用 递归思想,函数 mergesort(int a[ ],int s,int e,int temp[ ]),下标从 s 到 e,排序数组a[ ]。其方法是将a[ ]分成两半,排序前一半,排序后一半,然后用函数 merge() 将其两部分按顺序合并成一个有顺序的数组;而a[ ]的前后两部分又可继续递归使用 mergesort() 进行排序。

代码如下:

#include <stdio.h>

int a[10] = {13,27,19,2,8,12,2,8,30,89}; //待排序数组
int b[10];  //存放临时数据
void mergesort(int a[],int s,int e,int temp[]);    //排序数组a[],下标从 s 到 e 
void merge(int a[],int s,int m,int e,int temp[]);   //合并数组a[],下标 s -> m, m+1 -> e

void mergesort(int a[],int s,int e,int temp[]){
    if(s < e){
        int m = s + (e-s)/2;  //不写成 (s+e)/2,防止(s+e)数组大于int类型范围,而(s+e)/2还未超过int类型范围
        mergesort(a,s,m,temp);     //排序数组a[]前一半,s -> m
        mergesort(a,m+1,e,temp);    //排序数组a[]后一半,m+1 -> e
        merge(a,s,m,e,temp);        //按顺序合并这两部分
    }
}
void merge(int a[],int s,int m,int e,int temp[]){
    int p = 0;
    int p1 = s,p2 = m + 1;     //p1指向 a[s] -> a[m],p2指向 a[m+1] -> a[e]
    while(p1 <= m && p2 <= e){
        if(a[p1] < a[p2])
            temp[p++] = a[p1++];
        else
            temp[p++] = a[p2++];
    }
    while(p1 <=m)
        temp[p++] = a[p1++];
    while(p2 <= e)
        temp[p++] = a[p2++];
    for(int i = 0;i <= e - s;i++)   //合并结果存到数组a[]中
        a[s + i] = temp[i];
}
int main(void){
    int size = sizeof(a) / sizeof(a[0]);
    mergesort(a,0,size - 1,b);
    for(int i = 0;i < size;i++){
        printf("%4d",a[i]);
    }
    putchar('\n');

    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值