数据结构——排序(2)

数据结构——排序(2)

文章目录

  • 数据结构——排序(2)
    • 前言:
    • 1.快速排序(非递归版本)
      • 基本步骤:
      • 代码实现
    • 2.归并排序
      • 算法思想:
      • 核心步骤:
      • 代码实现:
      • 特征总结:
    • 3.计数排序(非比较排序)
      • 算法概念:
      • 核心步骤:
      • 代码实现:
      • 特征总结:
    • 4.排序算法的时间复杂度及稳定性分析

前言:

前面已经介绍了直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序已经递归版本的快速排序,在本篇将接着介绍快速排序的非递归版本、归并排序以及计数排序。

1.快速排序(非递归版本)

非递归版本的快速排序需要借助数据结构:栈

基本步骤:

1.初始化栈

2.推入初始区间:将整个数组的起始和结束索引推入栈中。

3.循环处理栈中的区间

4.推入新的区间:将基准元素的左右两个子区间压入栈中

5.重复步骤 3 和 4

6.结束

代码实现

//⾮递归版本快排
//借助数据结构---栈
void QuickSortNonR(int* arr, int left, int right)
{ST st; STInit(&st);StackPush(&st, right);StackPush(&st, left);while (!StackEmpty(&st)){//取栈顶元素---取两次int begin = StackTop(&st);StackPop(&st);int end = StackTop(&st);StackPop(&st);int prev = begin;int cur = begin + 1;int keyi = begin;while (cur<=end){if (arr[cur] <= arr[keyi] && ++prev != cur) {Swap(&arr[cur], &arr[prev]);}cur++;}Swap(&arr[keyi], &arr[prev]);keyi = prev;//根据基准值划分左右区间if (keyi + 1 < end){StackPush(&st, end);StackPush(&st, keyi + 1);}if (keyi - 1 > begin){StackPush(&st, keyi - 1);StackPush(&st, begin);}}STDestroy(&st);
}

2.归并排序

算法思想:

归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divideand Conquer)的⼀个⾮常典型的应⽤。将已有序的⼦序列合并,得到完全有序的序列;即先使每个⼦序列有序,再使⼦序列段间有序。若将两个有序表合并成⼀个有序表,称为⼆路归并

核心步骤:

在这里插入图片描述

代码实现:

//归并排序
void _MergeSort(int*arr,int left,int right,int*tmp)
{if (left >= right){return;}int mid = (left + right) / 2;_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid + 1, right, tmp);//合并//[left,mid]  [mid+1,right]int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1<=end1 && begin2<=end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else{tmp[index++] = arr[begin2++];}}//要么begin1越界 要么begin2越界while (begin1<=end1){tmp[index++] = arr[begin1++];}while (begin2<=end2){tmp[index++] = arr[begin2++];}//把tmp中的数据拷贝回arr中for (int i = left; i <= right; i++){arr[i] = tmp[i];}
}
void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1, tmp);free(tmp);
}

特征总结:

时间复杂度:O(nlogn)

空间复杂度:O(n)

3.计数排序(非比较排序)

算法概念:

计数排序(Counting Sort)计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。它是一种非比较排序算法,其核心思想是通过计数每个元素的出现次数来进行排序,适用于整数或有限范围内的非负整数排序。

核心步骤:

1)统计相同元素出现次数

2)根据统计的结果将序列回收到原来的序列中
在这里插入图片描述
在这里插入图片描述

代码实现:

//计数排序
void CountSort(int* arr, int n)
{//根据最大值最小值确定数组大小int max = arr[0], min = arr[0];for (int i = 0; i < n; i++){if (arr[i] > max) {max = arr[i];}if (arr[i] < min){min = arr[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int)* range);if (count == NULL){perror("malloc fail!");exit(1);}//初始化range属组中所有的数据为0memset(count, 0, range * sizeof(int));//统计数组中每个数据出现的次数for (int i = 0; i < n; i++){count[arr[i] - min]++;}//取count中的数据,往arr中放int index = 0;for (int i = 0; i < range; i++){while (count[i]--){arr[index++] = i + min;}}
}

特征总结:

计数排序在数据范围集中时,效率很⾼,但是适⽤范围及场景有限。

时间复杂度: O(N + range)

空间复杂度: O(range)

稳定性:稳定.

4.排序算法的时间复杂度及稳定性分析

排序方法平均情况最好情况最坏情况辅助空间稳定性
冒泡排序O(n2)O(n)O(n2)O(1)稳定
直接选择排序O(n2)O(n2)O(n2)O(1)不稳定
直接插入排序O(n2)O(n)O(n2)O(1)稳定
希尔排序O(nlogn)~O(n2)O(n1.3)O(n2)O(1)不稳定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不稳定
归并排序O(nlogn)O(nlogn)O(nlogn)O(1)不稳定
快速排序O(nlogn)O(nlogn)O(n2)O(nlogn)~O(n)不稳定

最后,希望这篇博客对你有所帮助,若有任何问题,欢迎评论区留言哦~

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

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

相关文章

【ubuntu】ubuntu20.04安装cuda12.6与显卡驱动

目录 1.安装cuda12.6 2.安装显卡驱动 1.安装cuda12.6 https://developer.nvidia.com/cuda-toolkit-archive https://developer.nvidia.com/cuda-12-6-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_version20.04&target_…

[MyBatis-Plus]快速入门

介绍 MyBatis-Plus是MyBatis的好朋友, 与MyBatis配合, 实现开发效率的提高 官网: 特点: 润物细无声: 只做增强不做改变, 引入它不会对现有工程产生影响, 如丝般顺滑效率自上: 只需简单配置, 即可快速进行单表CRUD, 从而节省大量时间功能丰富: 代码生产, 自动分页, 逻辑删除, …

【重学 MySQL】六十六、外键约束的使用

【重学 MySQL】六十六、外键约束的使用 外键约束的概念关键字主表和从表/父表和子表外键约束的创建条件外键约束的特点外键约束的创建方式外键约束的删除外键约束的约束等级外键约束的级联操作外键约束的示例外键约束的作用开发场景阿里开发规范 在MySQL中&#xff0c;外键约束…

雷池社区版配置遇到问题不要慌,查看本文解决

很多新人不太熟悉反向代理&#xff0c;所以导致配置站点出现问题 配置问题 记录常见的配置问题 配置后攻击测试没有拦截记录 检查访问请求有没有真实经过雷池 有很多新人配置站点后&#xff0c;真实的网站流量还是走的源站&#xff0c;导致雷池这边什么数据都没有 配置后…

【C】分支与循环2--while/for/do-while/goto以及break和continue在不同循环中的辨析~

分支与循环 while循环 if与while的对比 if(表达式)语句&#xff1b;while(表达式)语句&#xff1b;下面来看一个例子&#xff1a; 用 if 写&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {if (1)printf("hehe");//if后面条…

YOLOv8模型改进 第七讲 一种新颖的注意力机制 Outlook Attention

随着目标检测技术的不断发展&#xff0c;YOLOv8 作为最新一代的目标检测模型&#xff0c;已经在多个基准数据集上展现了其卓越的性能。然而&#xff0c;在复杂场景中&#xff0c;如何进一步提升模型的检测精度和鲁棒性依然是一个重要挑战。本文将探讨将 Outlook Attention 机制…

2024第四届”认证杯“数学中国全国大学生数学竞赛参赛通知

2024第四届“认证杯”数学中国 全国大学生数学竞赛报名通知 为了培养人才、服务教学、促进高等学校数学课程的改革和建设&#xff0c;增加大学生学习数学的兴趣&#xff0c;培养分析、解决问题的能力&#xff0c;发现和选拔数学创新人才&#xff0c;为青年学子提供一个展示数…

tortoisegit简单用法

一、基础设置 1.官网 https://tortoisegit.org/ TortoiseGit – Windows Shell Interface to Git 2.下载 3.安装 4.设置 5.克隆远程仓库 二、团队合作 1.在dev分支上创建分支 主分支&#xff1a;master 发开分支&#xff1a;dev 自己的分支&#xff1a;test_branch 2.修…

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…

小红书新ID保持项目StoryMaker,面部特征、服装、发型和身体特征都能保持一致!(已开源)

继之前和大家介绍的小红书在ID保持以及风格转换方面相关的优秀工作&#xff0c;感兴趣的小伙伴可以点击以下链接阅读~ 近期&#xff0c;小红书又新开源了一款文生图身份保持项目&#xff1a;StoryMaker&#xff0c;是一种个性化解决方案&#xff0c;它不仅保留了面部的一致性&…

智能交通与车联网:未来出行的创新变革

随着全球城市化进程的加速和交通需求的不断增加&#xff0c;传统的交通管理方式已经无法满足日益复杂的交通问题。智能交通&#xff08;Intelligent Transportation System, ITS&#xff09;和车联网&#xff08;Internet of Vehicles, IoV&#xff09;作为现代科技与交通行业深…

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…

outlook 添加企业邮箱账号出现 553 authentication is required 错误解决

系统报错如下 问题原因 发件服务器身份验证设置错误&#xff0c;或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例&#xff0c;具体操如下&#xff1a; 1、在Outlook客户端的电子邮件设置窗口中&#xff0c;单击其他设置&#xff1b; 2、…

【ICPC】The 2021 ICPC Asia Shanghai Regional Programming Contest H

Life is a Game #最小生成树 #重构树 #图论 #贪心 题目描述 A good problem should have a concise statement. You are given an array a a a of length n n n, initially filled with zeros, and another array b b b of length n n n. Your goal is to transform arr…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下&#xff0c;在线教育已成为教育领域的热门话题。而在众多在线教育平台中&#xff0c;集师知识付费小程序凭借其独特的定位和创新的模式&#xff0c;成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序&#xff0c;是一个集课程展示、…

哪款宠物空气净化器性价比高?希喂、米家和范罗士哪款更好?

这次我真的不是很想抱怨&#xff0c;是我男朋友真的很过分&#xff01;真的很过分&#xff0c;差点让我们两个分道扬镳。先听我说&#xff0c;这不是我和他都嫌家里太安静了吗&#xff0c;每天下班后两个人吃完饭就各玩各的手机&#xff0c;生活太无趣了&#xff0c;加上这几年…

软件功能测试重点和流程有哪些?专业软件测评服务公司推荐

软件功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。功能测试也叫黑盒测试或数据驱动测试&#xff0c;只需考虑需要测试的各个功能&#xff0c;不需要考虑整个软件的内部结构及代码.一般从软…

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 ES比较耗内存&#xff0c;建议虚拟机4G或以上内存&#xff0c;jvm1g以上的内存分…

告别信息过载!NotebookLM:你的AI学习与研究助手

在信息爆炸的时代&#xff0c;我们每天都面临着海量的信息&#xff0c;如何高效地处理和理解这些信息&#xff0c;成为了许多人面临的挑战。 Google 推出的 NotebookLM&#xff0c;或许能成为你的答案。这款结合了大语言模型 (LLM) 与用户笔记的 AI 笔记本&#xff0c;正在重新…