c语言归并排序(详解)

归并排序是一种分治算法,它将列表分割成较小的子列表,然后递归地对子列表进行排序,最后将这些子列表合并以产生已排序的列表。基本概念包括:

  1. 分割:将列表分割成较小的子列表,直到子列表的长度为1或0。
  2. 排序:递归地对子列表进行排序,直到所有子列表都已经有序。
  3. 合并:将已排序的子列表合并,通过比较两个子列表的元素,并按顺序放入一个新的列表中,直到所有子列表合并成一个已排序的列表。

设置单页面启动:
在这里插入图片描述归并排序项目结构:

在这里插入图片描述
归并排序cpp代码截图:
在这里插入图片描述归并排序cpp代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <sys/timeb.h>

#define MAX 10
using namespace std;


int* CreateArray() {
    // 开辟内存空间
    srand((unsigned int)time(NULL));
    int* arr = (int*)malloc(sizeof(int) * MAX);
    for (int i = 0; i < MAX; i++) {
        arr[i] = rand() % MAX;
    }
    return arr;
}
// 打印函数
void PrintArray(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        cout << arr[i] << " ";

    }
    cout << endl;

}
// 合并算法
void Merge(int arr[], int start, int end,int mid, int* temp) {
    int i_start = start;
    int i_end = mid;
    int j_start = mid + 1;
    int j_end = end;
    // 表示辅助空间有多少个元素
    int length = 0; 
    // 合并两个有序序列
    while (i_start <= i_end && j_start <= j_end) {
        if (arr[i_start] < arr[j_start]) {
            temp[length] = arr[i_start];
            length++;
            i_start++;
        }
        else {
            temp[length] = arr[j_start];
            j_start++;
            length++; 
        }
    }
    // 遍历i这个序列
    while (i_start <= i_end) {
        temp[length] = arr[i_start];
        i_start++;
        length++;
    }
    // 遍历j序列
    while (j_start <= j_end) {
        temp[length] = arr[j_start];
        length++;
        j_start++;
    }
    // 将辅助空间中的数据覆盖到原来的空间
    for (int i = 0; i < length; i++) {
        arr[start + i] = temp[i];
    }
}

// 排序函数:归并排序
void MergeSort(int arr[],int start,int end,int* temp) {
    if (start >= end) {
        return;
    

    }
    
    int mid = (start + end) / 2;
    // 分组:左半边
    MergeSort(arr,start,mid,temp);
    // 分组:右半边
    MergeSort(arr, mid + 1, end, temp);
    // 合并
    Merge(arr,start,end,mid,temp);



}

int main()
{
    // 创建一个数组
    int* myArr = CreateArray();
    PrintArray(myArr, MAX);
    // 辅助空间
    int* temp = (int*)malloc(sizeof(int) * MAX);
    MergeSort(myArr, 0, MAX - 1,temp);
    PrintArray(myArr, MAX);
    // 释放空间
    free(temp);
    free(myArr);
}

归并排序运行结果:
在这里插入图片描述


http://www.niftyadmin.cn/n/5252425.html

相关文章

贪吃蛇小游戏 --- 基于WIN32API【C语言】

一、前言 本文将用win32提供的API进行贪吃蛇小游戏的开发&#xff0c;用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇。也就是说&#xff0c;你只要会用vs2019或者其他版本的vs即可。不用额外学习esayx等其他软件。win32的API是电脑系统自带的函数接口&#xff0c;通…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

蓝桥杯 day01 奇怪的数列 特殊日期

奇怪的数列 题目描述 奇怪的数列 从 X 星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a; 13 1113 3113 132113 1113122113 ⋯⋯ YY 博士经彻夜研究&#xff0c;发现了规律&#xff1a; 第一行的数字随便是什么&#xff0c;以后每一行都是对上一行…

UniGui禁用缓存

今天有人问到如何禁用缓存&#xff0c;原因是引用了第三方js,css等文件&#xff0c;但是因为缓存的原因&#xff0c;修改后没有及时生效。 首先纠正一点&#xff0c;地址后加?不会禁用缓存 可以看到&#xff0c;后面即使加了&#xff1f;但仍然是from memory cache。对于浏览…

Python计时器

制作一个简单的Python计时器 在本教程中&#xff0c;我们将学习如何使用Python制作一个基础的计时器。这个计时器将能够开始计时、暂停、继续和重置时间。 设计思路 为了建立一个计时器&#xff0c;我们需要定义一个能够跟踪时间的变量&#xff0c;并且定期更新显示的时间。…

2023年最新prometheus + grafana搭建和使用

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

如何掌握构建 LMS 网站的艺术

目录 什么是学习管理系统 (LMS) 在线课程和 LMS 网站的好处 为什么 WordPress 对于 LMS 网站很重要 统一学习中心 多功能性和可扩展性 提高教育参与度 简化管理和监控 节省时间和费用 技能评估和绩效监督 持续学习和技能提升 使用 WordPress 插件构建成功的 LMS 课程 专注于您的…

游戏推广常用的ChatGPT通用提示词模板

目标用户&#xff1a;如何定位游戏的目标用户&#xff1f; 市场分析&#xff1a;如何进行游戏市场的分析&#xff1f; 竞品分析&#xff1a;如何分析竞争对手的游戏&#xff1f; 推广策略&#xff1a;如何制定有效的游戏推广策略&#xff1f; 广告投放&#xff1a;如何进行…