合并排序

合并排序
/*合并排序*/
#include <stdio.h>  
#include <malloc.h>  
#include <limits.h>  
  
void merge(int a[], const int indexStart, const int indexMid, const int indexEnd){  
     int i;
	int sizea1 = indexMid-indexStart+2;  
    int sizea2 = indexEnd-indexMid+1;  
    int *a1 = (int*)malloc(sizeof(int)*sizea1);  
    int *a2 = (int*)malloc(sizeof(int)*sizea2);  
    //将原数组均分为两个数组,并在结尾设立哨兵  
    for(i=0; i<sizea1-1; i++){  
        a1[i] = a[indexStart+i];  
    }  
    a1[sizea1-1] = INT_MAX;  
    for(i=0; i<sizea2; i++){  
        a2[i] = a[indexMid+i+1];  
    }  
    a2[sizea2-1] = INT_MAX;  
    //设定数组的初始数组  
    int index1 = 0;  
    int index2 = 0;   
    for(i=0; i<sizea1+sizea2-2; i++){  
        if(a1[index1]>a2[index2]){  
            a[i+indexStart] = a2[index2];  
            index2++;  
        }else{  
            a[i+indexStart] = a1[index1];  
            index1++;  
        }  
    }  
}  
void merge_sort(int a[], int indexStart, int indexEnd){  
    //若分解为长度为1的数组,则不再进行分解  
    if( indexEnd-indexStart==0 ){  
        return;  
    }else{  
        int indexMid = (indexStart+indexEnd)/2;  
        //将原数组分解为两个数组  
        merge_sort(a, indexStart, indexMid);  
        merge_sort(a, indexMid+1, indexEnd);  
        //对两数组进行排序  
        merge(a, indexStart, indexMid, indexEnd);  
    }  
}  
  
int main(int argc, char** argv){  
    int a[] = {5,2,4,7,1,3,2,6,0}; 
	int i;
    int length = sizeof(a) / sizeof(a[0]);  
    //显示原数组排列顺序 
	printf("原始排列是:\n");
    for(i=0; i<length; i++) {  
        printf("%d ", a[i]);  
    }  
    printf("\n");  
    merge_sort(a, 0, length-1);  
    //显示排序结果 
	printf("排列后是:\n");
    for(i=0; i<length; i++) {  
        printf("%d ", a[i]);  
    }  
    printf("\n");  
    return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值