2-路归并排序(C语言版)

//2-路归并排序排序(元素用线性表存储) 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define InitiaSize 10
//定义动态线性表 
typedef struct{
    int* data;             //数据域 
    int len;               //线性表当前长度 
    int MaxSize;           //线性表最大容量 
}SqList;
//初始化并对线性表随机赋值
bool InitiaList(SqList &L){
    int len;
    printf("请输入你想要的线性表的长度:");
    scanf("%d",&len);
    while(len < 0){
        printf("您输入的长度不规范,请重新输入!\n");
        scanf("%d",&len);
    }
    if(len <= InitiaSize){
        L.data = (int*)malloc(sizeof(int)*InitiaSize);
        L.len = len;
        L.MaxSize = InitiaSize;
    }
    else{
        L.data = (int*)malloc(sizeof(int)*len);
        L.len = len;
        L.MaxSize = len;    
    }
    printf("线性表初始化完毕!当前长度是%d,最大容量是%d\n",L.len,L.MaxSize);
    int i;
    printf("接下来对线性表进行随机赋值:\n");
    srand(time(NULL));
    for(i = 0; i < L.len; i++){
        L.data[i] = rand()%100;
    }
    printf("随机赋值操作执行完毕!\n");
    return true;

//读取线性表的内容
void PrintList(SqList &L){
    if((L.len == 0)||(L.MaxSize == 0)){
        printf("此线性表为空,无法进行读取操作!\n");
        return;
    }
    int i;
    for(i = 0; i < L.len; i++){
        if(i == L.len - 1){
            printf("%d\n",L.data[i]);
        }
        else{
            printf("%d ",L.data[i]);
        }
    }
    printf("线性表内容读取完毕!该线性表长度是%d,最大容量是%d。\n",L.len,L.MaxSize);

//归并排序  2路归并 
void Merge(SqList &L, int l, int mid, int r, int* Arr){
    int i, j, k;
    for(i = l; i <= r; i++){
        Arr[i] = L.data[i];                 //赋值线性表的内容 
    }
    for(i = l, j = mid + 1, k = i; (i <= mid)&&(j <= r); k++){
        if(Arr[i] <= Arr[j]){               //谁小就先进入 
            L.data[k] = Arr[i++];
        }
        else{
            L.data[k] = Arr[j++];
        }
    }
    while(i <= mid){L.data[k++] = Arr[i++];}
    while(j <= r){L.data[k++] = Arr[j++];}
}
void MergeSort(SqList &L, int l, int r){
    if((L.len == 0)||(L.MaxSize == 0)){
        printf("此线性表为空,无法进行归并排序!\n");
        return;
    }
    if(l < r){
        int mid = (l + r)/2;                           //将线性表分成两组 
        int* Arr;
        Arr = (int*)malloc(sizeof(int)*L.len);         //建立一个辅助数组 
        MergeSort(L, l, mid);                          //对左半部分进行归并排序 
        MergeSort(L, mid + 1, r);                      //对右半部分进行归并排序 
        Merge(L, l, mid, r, Arr);                      //对已经排好序的两部分数组进行合并 
        free(Arr);
    }
}
int main(){
    SqList L;              //定义一个线性表
    InitiaList(L);         //对线性表进行初始化并随机赋值
    PrintList(L);          //输出线性表内容
    clock_t T;             //对选择排序所花费的时间进行记录
    printf("即将进行归并排序!\n");
    T = clock(); 
    MergeSort(L, 0, L.len - 1);
    T = clock();
    PrintList(L);          //输出线性表内容  
    printf("归并排序执行完毕!\n");
    printf("此次排序花费了%lf s\n",((float)T)/CLOCKS_PER_SEC);
    return 0;

//上述代码如有错误,还请在评论区指正,感谢大家!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值