当前位置: 首页 > news >正文

排序与算法:归并排序

执行效果
归并排序的执行效果是这样的:

呃……看不懂吗?没关系,接着往下看介绍 


算法介绍
归并排序(Merge Sort)是创建在归并操作上的一种有效的排序算法,效率为 O(n log n)。1945 年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

算法档案
时间复杂度:O(n * logn)
最优时间复杂度:O(n)
平均时间复杂度:O(n * logn)
空间复杂度:O(n)
稳定性:稳定

算法步骤

  • 把 n 个元素看成 n 个长度为 1 的有序子表
  • 进行两两归并使记录关键字有序,得到 n/2 个长度为 2 的有序子表
  • 重复第 2 个步骤直到所有记录归并成一个长度为 n 的有序表为止


算法实现

#include <stdio.h>

void merge_sort(int array[], int length);
void merge_sort_recursive(int array[], int reg[], int start, int end);

void merge_sort_recursive(int array[], int reg[], int start, int end)
{
        if (start >= end)
        {
                return;
        }

        int k = start;
        int length = end - start;
        int mid = (length / 2) + start;
        int start1 = start, end1 = mid;
        int start2 = mid + 1, end2 = end;

        merge_sort_recursive(array, reg, start1, end1);
        merge_sort_recursive(array, reg, start2, end2);
        while (start1 <= end1 && start2 <= end2)
        {
                reg[k++] = array[zxsq-anti-bbcode-start1] < array[zxsq-anti-bbcode-start2] ? array[start1++] : array[start2++];
        }

        while (start1 <= end1)
        {
                reg[k++] = array[start1++];
        }

        while (start2 <= end2)
        {
                reg[k++] = array[start2++];
        }

        for (k = start; k <= end; k++)
        {
                array[zxsq-anti-bbcode-k] = reg[zxsq-anti-bbcode-k];
        }
}


void merge_sort(int array[], int length)
{
        int reg[zxsq-anti-bbcode-length];
        merge_sort_recursive(array, reg, 0, length-1);
}


int main(void)
{
        int array[] = {73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109};
        int i, length;

        length = sizeof(array) / sizeof(array[zxsq-anti-bbcode-0]);
        merge_sort(array, length);
        printf("排序后的结果是:");

        for (i = 0; i < length; i++)
        {
                printf("%d ", array[zxsq-anti-bbcode-i]);
        }
        putchar('\n');

        return 0;
}

程序实现如下:

相关文章:

  • V8 如何进行内存监控和调试
  • 基于SpringBoot的儿童性教育网站(源码+数据库)
  • startai产品精修教程
  • Webpack,Vite打包的理解
  • 主机的基本构成
  • Linux(Ubuntu24.04)源码编译安装OpenCV4.6.0
  • redis的应用,缓存,分布式锁
  • C语言——深入理解指针(2)(数组与指针)
  • 第三天面试题
  • 迅速闭合抽气止回阀的安装、维护及使用要点-耀圣
  • llama3 微调教程之 llama factory 的 安装部署与模型微调过程,模型量化和gguf转换。
  • Java Web开发实战与项目——Spring Security与权限管理实现
  • Pycharm中断点使用技巧
  • JavaAPI(字符串 正则表达式)
  • Java基础专项复习5——异常
  • 全局动态组件uniapp(vue)
  • ubuntu22.04离线安装nginx
  • 用promptfoo做大模型安全性测评
  • P8598 [蓝桥杯 2013 省 AB] 错误票据
  • 深入理解ES6核心特性:现代JavaScript开发的基石
  • 上海145家博物馆、73家美术馆将减免费开放
  • 大英博物馆展歌川广重:他是梵高最钟爱的浮世绘名家
  • 宝通科技:与宇树合作已签约,四足机器人在工业场景落地是重点商业化项目
  • 人民日报任平:从汽车产销、外贸大盘看中国经济前景
  • 国务院关税税则委员会关于调整对原产于美国的进口商品加征关税措施的公告
  • 京东一季度净利增长五成,营收增速创近三年新高,称外卖业务取得显著进展