归并排序,外排序,计数排序(非比较排序)

归并排序:(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
也就是:假设左边有序,右边有序,然后合并在一起归并后就有序。归并要借助临时的第三方数组。
不一定是均分,只是下面的例子正好比较均匀。
快排是前序,归并是后续。
归并是先递归到两个数再归并,一层一层往回返着归并(排序)。
时间复杂度:O(N*logN)
空间复杂度:O(N) — 开辟临时数组
在这里插入图片描述

 // 归并排序递归实现
void _MergeSort(int* a, int left, int right, int* tmp)
{//分到最后区间只有一个数或者没有这样的区间了返回。if(left >= right){return;}int mid = (left + right)/2;//[left, mid] [mid+1, right]_MerageSort(a, left, mid, tmp);_MerageSort(a, mid+1, right, tmp);// 两段有序子区间归并放到tmp中然后拷贝回aint begin1 = left, end1 = mid;int begin2 = mid+1, end2 = right;int i = left;// 在两个区间中选择小的数先放进tmpwhile(begin1 <= end1 && begin2 <= end2){if(a[begin1] < a[begin2])tmp[i++] = a[begin1++];elsetmp[i++] = a[begin2++];}//将两个区间中没放完的那个区间的有序数组尾插到tmp中while(begin1 <= end1)tmp[i++] = a[begin1++];while(begin2 <= end2)tmp[i++] = a[begin2++];// 将tmp的数据返回给a right是下标 所以得<=for(int j = left; j<=right; j++)a[j] = tmp[j];
}
void MergeSort(int* a, int n) //n传参传的是数组的大小
{int* tmp = (int*)malloc(sizeof(int)*n)_MergeSort(a, 0, n-1, tmp) //n-1传参传的是数组下标的闭区间大小free(tmp);
}

非递归方法:每次归完后都需要将归好的数组返回给原数组。最后将有序的tmp给a然后释放tmp。
代码控制中有个gap,gap是1 就是11归(两个相比),gap是2就是22归(四个相比), gap是4就是44归(八个相比)。
问题:
1.最后一个小组归并时,第一个小区间不够gap个,则不需要归并 不处理时OK的 因为他同样满足第二个小区间不存在,因此不处理OK。
2.最后一个小组归并时,第二个小区间不存在,则不需要归并了
3.最后一个小组归并时,第二个小区间存在但是第二个区间不够gap个
问题1和问题2可以合并处理。
在这里插入图片描述

 // 归并排序非递归实现
void _Merge(int*a, int* tmp, int begin1, int end1, int begin2, int end2)
{int i = begin1;int j = begin1;// 在两个区间中选择小的数先放进tmpwhile(begin1 <= end1 && begin2 <= end2){if(a[begin1] < a[begin2])tmp[i++] = a[begin1++];elsetmp[i++] = a[begin2++];}//将两个区间中没放完的那个区间的有序数组尾插到tmp中while(begin1 <= end1)tmp[i++] = a[begin1++];while(begin2 <= end2)tmp[i++] = a[begin2++];// 将tmp的数据返回给a right是下标 所以得<=for(; j<=end2; j++)a[j] = tmp[j];
}
void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int)*n)_MergeSort(a, 0, n-1, tmp) //n-1传参传的是数组下标的闭区间大小int gap =1;while(gap < n){//进来gap = 1是11 gap =2 是22 gap=4 是44for(int i=0; i<n; i += 2*gap){int begin1 = i, end1 = i+gap-1, begin2 = i+gap, end2 = i+2*gap-1;//第二个小区间不存在,则不需要归并了if(begin2 >= n)break;//第二个区间存在但是第二个区间不够gap个,结束位置越界了,需要修正if(end2 >= n)end2 = n-1;//循环控制归并的边界啊// [i, i+gap-1] [i+gap, i+2*gap-1] ..._Merge(a, tmp, begin1 , end1 , begin2, end2); //传的就是两个边界 每次传两个边界}gap *= 2;} free(tmp);
}

计数统计排序:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤:
1.统计相同元素出现次数
2.根据统计的结果将序列回收到原来的序列中
时间复杂度:O(max(N,rang)) 就是N和范围谁大就是O谁。 适合一组数据数据范围比较集中,优秀的排序。
空间复杂度:O(range)
范围集中效率高,具有局限性。并且只适合整数。
在这里插入图片描述

 // 计数排序
void CountSort(int* a, int n)
{int max = a[0], min = a[0];for(int i = 0; i <n; ++i){if(a[i] > max)max = a[i];if(a[i] < min)min = a[i];}int range = max-min +1;int* count = (int*)malloc(sizeof(int)*range);memset(count, 0, sizeof(int)*range); //将count初始化为0for(int i =0; i<n; ++i){count[a[i] - min]++ //让对应的位置++}//写入a中int i=0;for(int j=0; j<range; j++) // 循环count数组{while(count[j]--)//让这个位置的次数一直-到0 就打印完了次数。{a[i++] = j+min;}}free(count);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型(LLM) 是仅仅比 模型(Model) 更大吗?

我们日常经常提到模型 model&#xff0c;大模型LLM&#xff0c;大家都知道这两者之间的区别和联系吗&#xff1f; 只是如下图这样&#xff0c;大小的区别吗&#xff1f;下面我们对模型model和大模型LLM进行解释和描述 什么是模型&#xff1f; 模型是机器学习中一个核心概念&a…

[Docker学习笔记]Docker的原理Docker常见命令

文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …

SWAP、AquaCrop、FVCOM、Delft3D、SWAT、R+VIC、HSPF、HEC-HMS......

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&…

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 目录 文章目录 [大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26目录论文信息摘要主要内容包括&#xff1a;研究方法与资源的分类&#xff1a;结论&#xff1a; 论文信息 Title: Recent Advancement …

理解Js执行上下文

执行上下文 执行上下文&#xff08;Context&#xff09;又称上下文,在 JavaScript 中是一个重要的概念&#xff0c;它决定了变量和函数的可访问性及其行为。每个上下文都有一个关联的变量对象&#xff08;Variable Object&#xff09;&#xff0c;所有在该上下文中定义的变量和…

Halcon基础系列1-基础算子

1 窗口介绍 打开Halcon 的主界面主要有图形窗口、算子窗口、变量窗口和程序窗口&#xff0c;可拖动调整位置&#xff0c;关闭后可在窗口下拉选项中找到。 2 显示操作 关闭-dev_close_window() 打开-dev_open_window (0, 0, 712, 512, black, WindowHandle) 显示-dev_display(…

【数据结构与算法】Z算法(扩展KMP)(C++和Python写法)

Z算法&#xff08;扩展KMP&#xff09; 文章目录 Z算法&#xff08;扩展KMP&#xff09;朴素求法线性求法力扣类型题变种题&#xff1a;[3303. 第一个几乎相等子字符串的下标](https://leetcode.cn/problems/find-the-occurrence-of-first-almost-equal-substring/) 所谓Z算法&…

9.29 LeetCode 3304、3300、3301

思路&#xff1a; ⭐进行无限次操作&#xff0c;但是 k 的取值小于 500 &#xff0c;所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ &#xff0c;单独处理使其变为 ‘a’ 得到得到操作后的新字符串&#xff0c;和原字符串拼接 class Solution { …

box-im

任何一个开源项目&#xff0c;都可以让自己得到提升&#xff01; 启动minio: minio.exe server C:\Program Files\Minio\minioData

Python: RAII:函数执行完毕,socket对象主动发送fin

第一次知道python的这个默认RAII的功能。函数内的举报socket变量&#xff0c;在函数退出的时候&#xff0c;主动发fin。 import socket import threading import timedef create_connection():s socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((169.254.218.0,…

springboot+大数据+基于协同过滤算法的校园食堂订餐系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

LLM | llama.cpp 安装使用(支持CPU、Metal及CUDA的单卡/多卡推理)

1. 详细步骤 1.1 安装 cuda 等 nvidia 依赖 # 以 CUDA Toolkit 12.4: Ubuntu-22.04/24.04(x86_64) 为例&#xff0c;注意区分 WSL 和 Ubuntu&#xff0c;详见 https://developer.nvidia.com/cuda-12-4-1-download-archive?target_osLinux&target_archx86_64&Distrib…

刚面试完的前端面试题

今天晚上参加了一场长达40多分钟的技术面。我觉得面试官非常专业&#xff0c;问的问题也都是很棒的&#xff01;自己很多知识都需要学习。所以我决定回想并记录下来。回答不对的地方欢迎大家指正&#xff01; 我自己在小本本上回忆出来的大概就是26道题。后期我会持续更新我学习…

数字图像处理:空间域滤波

1.数字图像处理&#xff1a;空间域滤波 1.1 滤波器核&#xff08;相关核&#xff09;与卷积 图像上的邻域计算 线性空间滤波的原理 滤波器核&#xff08;相关核&#xff09;是如何得到的&#xff1f; 空间域的卷积 卷积&#xff1a;滤波器核与window中的对应值相乘后所有…

如何使用 ChatGPT 生成万字长文?

要使用ChatGPT生成万字长文&#xff0c;可以采用以下方法&#xff0c;以保证文章结构清晰&#xff0c;内容充实&#xff1a; 1. 确定主题和大纲 明确主题&#xff1a;先确定文章的中心主题&#xff0c;例如技术、文学、历史、哲学等领域的具体问题。细化大纲&#xff1a;将主…

单链表(纯代码)

SListNode.h #pragma once #include <stdio.h> #include<assert.h> #include<stdlib.h> typedef int SLDatetype; typedef struct SListNode {SLDatetype data;//节点数据struct SListNode* next;//指针保存下一个节点的地址 }SLND;//打印链表 void SLTPrin…

SpringBoot实现学科竞赛管理:最佳实践

摘 要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景…

华为OD真题机试-英文输入法(Java)

华为OD机试真题中的“英文输入法”题目主要考察的是字符串处理、单词提取、以及基于前缀的单词联想功能。以下是对该题目的详细解析&#xff1a; 题目描述 主管期望你来实现英文输入法单词联想功能。具体需求如下&#xff1a; 依据用户输入的单词前缀&#xff0c;从已输入的…

MIMO 2T4R BBU RHUB AAU

MIMO&#xff08;Multiple-Input Multiple-Output&#xff0c;多输入多输出&#xff09;是一种无线通信技术&#xff0c;它通过在发射端和接收端使用多个天线来提高数据传输速率和信号质量。"2T4R"是MIMO技术中的一种配置&#xff0c;其中"2T"代表有两个发…

SpringBoot--为什么Controller是串行的?怎样才能并行?

原文网址&#xff1a;SpringBoot--为什么Controller是串行的&#xff1f;怎样才能并行&#xff1f;-CSDN博客 简介 本文介绍SpringBoot为什么Controller是串行的&#xff1f;在什么场景下才能并行执行&#xff1f; 大家都知道&#xff0c;SpringBoot的Controller按理是并行执…