归并排序--C语言实现

1. 简述

归并排序的原理是将,两个较大的数组分为大小几乎一致的两个数组。

再将两个数组进行合并成新的有序数组。

合并两个数组的时候需要额外的一个数组的空间。

2. 实现

上图说明过程

  • 代码
c 复制代码
#include <stdio.h>

void Merge(int *arr, int *tmp, int l, int center, int r) {

    int lp = l;
    int rp = center + 1;
    int ptr = l;

    while ( lp < center + 1 || rp < r + 1) {
        if ( lp > center || (rp < r + 1 && arr[lp] > arr[rp]) )
            tmp[ptr++] = arr[rp++];
        else
            tmp[ptr++] = arr[lp++];
    }


    for ( int i = l; i < r + 1; ++i)
        arr[i] = tmp[i];
}



void mergeSort(int *arr,int *tmp, int l,int r) {

    if ( l >= r)
        return ;
    int center = l + (r - l >> 1);
    mergeSort(arr, tmp, l, center);
    mergeSort(arr, tmp, center + 1, r);


    Merge(arr, tmp, l, center, r);

}

int main() {
	int arr[] = {5,1,3,7,8,4,2,6};
    int tmp[] = {0,0,0,0,0,0,0,0};

    int sz = sizeof(arr)/sizeof(arr[0]);

    mergeSort(arr, tmp, 0, sz - 1);


    for ( int i = 0; i < sz; ++i)
        printf("%d ", arr[i]);
    
	return 0;
}
相关推荐
To_OC3 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495644 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
爱刷碗的苏泓舒8 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽11 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米11 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记11 小时前
堆(数据结构)
数据结构·
星空露珠12 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
xiaobobo333013 小时前
C语言中宏定义宏名和宏值之间的关系
c语言·宏定义·语义型