排序算法(五)--归并排序

文章目录

归并排序 C语言实例

引言

归并排序(Merge Sort)作为一种经典的排序算法,以其稳定性、分治法的巧妙应用以及相对高效的时间复杂度而著称。

归并排序概述

归并排序采用分治法(Divide and Conquer)策略,其基本思想是将待排序的数组分成若干个子数组,分别对每个子数组进行排序,然后再将已排序的子数组合并成一个有序的数组。归并排序的时间复杂度为O(n log n),无论数据初始状态如何,其时间复杂度均保持不变,因此是一种较为稳定的排序算法。

C语言实现

以下是一个用C语言实现的归并排序示例,包括归并函数和主排序函数:

#include <stdio.h>

#include <stdlib.h>

// 合并两个有序数组

void merge(int arr[], int left, int mid, int right) {

int n1 = mid - left + 1;

int n2 = right - mid;

// 创建临时数组

int* L = (int*)malloc(n1 * sizeof(int));

int* R = (int*)malloc(n2 * sizeof(int));

复制代码
// 拷贝数据到临时数组L和R
for (int i = 0; i < n1; i++)
    L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
    R[j] = arr[mid + 1 + j];
// 合并临时数组到arr[left..right]
int i = 0, j = 0;
int k = left;
while (i < n1 && j < n2) {
    if (L[i] <= R[j]) {
        arr[k] = L[i];
        i++;
    } else {
        arr[k] = R[j];
        j++;
    }
    k++;
}
// 拷贝L[]的剩余元素
while (i < n1) {
    arr[k] = L[i];
    i++;
    k++;
}
// 拷贝R[]的剩余元素
while (j < n2) {
    arr[k] = R[j];
    j++;
    k++;
}
// 释放临时数组
free(L);
free(R);

}

// 归并排序主函数

void mergeSort(int arr[], int left, int right) {

if (left < right) {

int mid = left + (right - left) / 2;

// 递归排序左右子数组

mergeSort(arr, left, mid);

mergeSort(arr, mid + 1, right);

// 合并已排序的子数组

merge(arr, left, mid, right);

}

}

// 打印数组

void printArray(int arr[], int size) {

for (int i = 0; i < size; i++)

printf("%d ", arr[i]);

printf("\n");

}

// 主函数

int main() {

int arr[] = {12, 11, 13, 5, 6, 7};

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

printf("给定的数组是 \n");

printArray(arr, arr_size);

mergeSort(arr, 0, arr_size - 1);

printf("\n排序后的数组是 \n");

printArray(arr, arr_size);

return 0;

}

代码解析

merge函数

该函数负责合并两个有序的子数组。

首先,计算两个子数组的长度,并分配临时数组L和R来存储这些子数组的元素。

然后,通过比较L和R中的元素,依次将较小的元素复制到原数组中,直到所有元素都被合并。

最后,释放临时数组的内存。
mergeSort函数

该函数是归并排序的主函数,采用递归的方式对数组进行分治。

首先,找到数组的中间位置mid。

然后,递归地对左子数组和右子数组进行排序。

最后,调用merge函数合并已排序的子数组。
printArray函数

该函数用于打印数组的元素,便于观察排序前后的变化。
main函数

在主函数中,定义一个待排序的数组,并调用mergeSort函数对其进行排序。

排序前后分别打印数组,以验证排序算法的正确性。

结论

归并排序作为一种经典的排序算法,其实现过程体现了分治法的思想,具有稳定性和高效性

相关推荐
米芝鱼1 分钟前
Unity自定义按钮
算法·ui·unity·游戏引擎·编辑器扩展
野蛮人6号4 分钟前
力扣热题100道,内容和力扣官方稍有不同,记录了本人的一些独特的解法
算法·leetcode
米芝鱼5 分钟前
Unity自定义TextImage,鼠标悬浮显示信息
算法·ui·unity·编辑器·游戏引擎·图形渲染
Tisfy21 分钟前
LeetCode 1925.统计平方和三元组的数目:两层循环枚举
算法·leetcode·职场和发展
AI科技星22 分钟前
伟大的跨越:从超距作用到时空运动——牛顿与张祥前引力场方程的终极对比
开发语言·数据结构·经验分享·线性代数·算法
电摇小人30 分钟前
类欧几里得算法来了!!(C++版)
算法·类欧几里得
刘 大 望31 分钟前
JVM(Java虚拟机)
java·开发语言·jvm·数据结构·后端·java-ee
元亓亓亓32 分钟前
LeetCode热题100--155. 最小栈--中等
java·算法·leetcode
AI视觉网奇33 分钟前
标签拷贝 labelme json格式
算法·计算机视觉
高山上有一只小老虎37 分钟前
小红的双生串
java·算法