归并排序--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;
}
相关推荐
头发还没掉光光9 小时前
Linux多线程之自旋锁与读写锁
linux·运维·算法
fashion 道格9 小时前
C 语言希尔排序:原理、实现与性能深度解析
数据结构·算法·排序算法
无限进步_9 小时前
C语言atoi函数实现详解:从基础到优化
c语言·开发语言·c++·git·后端·github·visual studio
如意猴9 小时前
实现链式结构二叉树--递归中的暴力美学(第13讲)
数据结构
初夏睡觉9 小时前
P1048 [NOIP 2005 普及组] 采药
数据结构·c++·算法
小欣加油9 小时前
leetcode 1513 仅含1的子串数
c++·算法·leetcode·职场和发展
树在风中摇曳9 小时前
【C语言预处理器全解析】宏、条件编译、字符串化、拼接
c语言·算法
CodeWizard~9 小时前
P7149 [USACO20DEC] Rectangular Pasture S题解
算法
fashion 道格10 小时前
用 C 语言破解汉诺塔难题:递归思想的实战演练
c语言·算法
李玮豪Jimmy10 小时前
Day18:二叉树part8(669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)
java·服务器·算法