0
点赞
收藏
分享

微信扫一扫

归并排序简介

软件共享软件 2022-04-13 阅读 57
算法

算法流程:分解数组,递归求解,合并排序。

  • 将数组A[1,n]排序 问题分解为A[1,[n/2]]和A[[n/2]+1,n]排序问题

  • 递归解决子问题得到两个有序的子数组

  • 将两个有序子数组合并为一个有序数组

代码

#include <stdlib.h>
int a[100];//输入数组
int b[100];//暂存数组
int n;//数组长度
void merge_sort(int left, int right);//分割数组
void merge(int left1, int left2, int right);//合并数组
​
int main()
{
    int i;
    printf("请输入数组长度:");
    scanf("%d", &n);
    printf("请输入数组:\n");
    for(i=0; i<n; i++){//输入
        scanf("%d", &a[i]);
    }
    merge_sort(0,n-1);
    for(i=0; i<n; i++){//输出
        printf("%d ",a[i]);
    }
    return 0;
}
​
void merge_sort(int left, int right){
    if(left >= right){
        return ;
    }
    int mid = (left+right)/2;
    merge_sort(left, mid);
    merge_sort(mid+1, right);
    merge(left, mid, right);
}
​
void merge(int left, int mid, int right){
    int i = left;
    int j = left;
    int k = mid+1;
    int m;
    for(m = 0; m < n; m++){
        b[m] = a[m];
    }
    while(j <= mid && k <= right){
        if(b[j] <= b[k]){
            a[i] = b[j];
            i++;
            j++;
        }
        if(b[j] > b[k]){
            a[i] = b[k];
            i++;
            k++;
        }
    }
    if(j > mid){
        while(k <= right){
            a[i] = b[k];
            i++;
            k++;
        }
    }
    if(k > right){
        while(j <= mid){
            a[i] = b[j];
            i++;
            j++;
        }
    }
}
举报

相关推荐

0 条评论