数据结构排序合集(笔记)

目录

一.插入排序与希尔排序

二.选择排序与堆排序

三.冒泡排序和快速排序

四.归并排序

五.计数排序


一.插入排序与希尔排序

时间复杂度空间复杂度稳定性
插入排序O(N^2)O(1)稳定
希尔排序O(N^1.3)O(1)不稳定

插入排序: 

希尔排序(两个排序的时间复杂度是一样的,即使是四循环,他们效率也相同):


二.选择排序与堆排序

时间复杂度空间复杂度稳定性
选择排序O(N^2)O(1)不稳定
堆排序O(N*logN)O(1)不稳定

void SelectSort(int* a, int n)//选择排序
{int begin = 0;int end = n - 1;while(begin < end){int mini = begin;int maxi = end;for (int i = begin; i <= end; i++)//选出最大和最小进行交换{if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}swap(&a[mini], &a[begin]);if (begin == maxi)maxi = mini;swap(&a[maxi], &a[end]);end--;begin++;}
}

(选择排序是特别慢,也没有稳定性的排序,可能连冒泡都比不过)

堆排序( 因为要排升序,所以建大堆):


三.冒泡排序和快速排序

时间复杂度空间复杂度稳定性
冒泡排序O(N^2)O(1)稳定
快速排序O(N*logN)O(logN)~O(N)不稳定

冒泡排序:

快速排序:

int Getmid(int*a,int left,int right)//三数取中
{int midi = (left + right) / 2;if (a[right] > a[left]){if (a[midi] > a[right]){return right;}else if (a[midi] < a[left]){return left;}elsereturn midi;}else// if (a[left] >= a[right]){if (a[midi] > a[left]){return left;}else if (a[midi] < a[right]){return right;}elsereturn midi;}
}

不用使用递归的qsort(用堆去模拟递归)

void QuickSortNonR(int* a, int left, int right)
{Stack st;StackInit(&st);StackPush(&st, right);StackPush(&st, left);while (!StackEmpty(&st)){int begin = StackTop(&st);StackPop(&st);int end = StackTop(&st);StackPop(&st);int keyi = PartSort3(a, begin, end);if (keyi + 1 < end){StackPush(&st, end);StackPush(&st, keyi + 1);}if (begin < keyi - 1){StackPush(&st, keyi - 1);StackPush(&st, begin);}}StackDestroy(&st);
}

四.归并排序

时间复杂度空间复杂度稳定性
归并排序O(N*logN)O(logN)稳定

void _MergeSort(int* a, int* tmp, int left,int right)
{if (left >= right)return;int midi = (left + right) / 2;_MergeSort(a, tmp, left, midi);_MergeSort(a, tmp, midi+1, right);//归 int begin1 = left, end1 = midi;int begin2 = midi+1, end2 = right;int i = left;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}memcpy(a+left, tmp+left, sizeof(int)*((right - left)+1));
}

非递归实现归并排序:

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(n*sizeof(int));if (tmp == NULL){perror("malloc fail");return;}int gap = 1;while (gap < n){for (int i = 0; i < n;i += 2*gap)//{int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;int j = i;//[i,end1] [i+gap,end2]if (begin2 >= n)break;if (end2 >= n)end2 = n-1;printf("[%d %d]  [%d %d]", begin1, end1, begin2, end2);while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}memcpy(a+i, tmp+i, sizeof(int) * (end2 - i +1));//}printf("\n");gap = 2*gap;}free(tmp);tmp = NULL;
}

五.计数排序

// 计数排序
void CountSort(int* a, int n)
{int max = a[0], min = a[0];for (int i = 0; i < n; i++)//选出最大最小得到区间大小{if (max < a[i])max = a[i];if (min > a[i])min = a[i];}int range = max - min +1 ;int* count = (int*)calloc(range,sizeof(int));if (count == NULL){perror("malloc fail");return;}for (int i = 0; i < n; i++)//给新数组进行计数{count[a[i] - min]++;}int j = 0;for (int i = 0; i < range; i++)//覆盖旧数组{while (count[i]--){a[j++] = i + min;}}free(count);count = NULL;
}

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

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

相关文章

报红:找不到名称ref ts(2304)、‘ref‘ is not defined. eslint(no-undef)

接上篇 在上篇介绍了使用 unplugin-auto-import 和 unplugin-vue-components 配置完成后&#xff0c;项目可以正常运行&#xff0c;并且页面也正常显示&#xff0c;但vscode里就是报红 这个报红可能是由于 ts 发出的&#xff0c;也可能是由于 eslint 发出的 具体可以用鼠标…

打卡第22天------回溯算法

开始学习了,希望我可以尽快成功上岸! 一、回溯理论基础 什么是回溯法?回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率回溯法的本质是穷举,穷举所有可能,然后找出我们想要的答案。如果想让回溯法高效一些,可…

Docker-Compose实现MySQL之主从复制

1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…

我用Tauri开发的待办效率工具开源了!

开源仓库地址 gitee Git仓库地址:https://gitee.com/zhanhongzhu/zhanhongzhu.git 应用地址 windows应用地址下载 https://kestrel-task.cn 具体内容 也可以看&#x1f389;使用Taurivitekoa2mysql开发了一款待办效率应用 这篇文章。 &#x1f4bb;技术栈 Tauri: Tauri…

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理&#xff08;NLP&#xff09;和大规模语言模型&#xff08;LLM&#xff09;是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较&#xff0c;帮助新手了解这两个领域的基础知识。 传统自然语言处理&#xff08;NLP&…

Angular中component和directive的区别?

在Angular中&#xff0c;Component和Directive都是重要的构建块&#xff0c;用于构建和组织应用程序的UI。然而&#xff0c;它们有不同的用途和特点。以下是Component和Directive的主要区别&#xff1a; Component&#xff08;组件&#xff09; 1、定义&#xff1a;Component…

采集PCM,将base64片段转换为wav音频文件

需求 开始录音——监听录音数据——结束录音 在监听录音数据过程中&#xff1a;客户端每100ms给前端传输一次数据&#xff08;pcm数据转成base64&#xff09;&#xff0c;前端需要将base64片段解码、合并、添加WAV头、转成File、上传到 OSS之后将 url 给到服务端处理。 {num…

Redis分布式系统中的主从复制

本篇文章主要对Redis的主从复制进行讲解。主要分析复制的原理&#xff0c;包括:建立复制、全量复制、部分复制、全量复制、心跳检测等。希望本篇文章会对你有所帮助。 文章目录 一、主从复制简介 二、配置主从复制模式 断开主从复制 安全性 只读 传输延迟 三、拓扑结构 四、主…

【git】太大了失败: fatal: fetch-pack: invalid index-pack output

#‘’ Git仓库过大致使clone失败的解决方法 上述大神的方法&#xff0c;亲测有效 中途失败: 太大了 fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: fetch-pack: invalid index-pack output关闭压缩 git config --global core.…

如何利用VPN和NAT技术实现高效安全的网络连接

文章目录 **什么是VPN&#xff1f;****专用地址的使用****VPN的工作原理****远程接入VPN****VPN的应用实例****什么是NAT&#xff1f;****NAT的工作原理****NAPT&#xff08;网络地址与端口号转换&#xff09;****NAT的优势和局限****NAT的应用实例****VPN和NAT的结合****常见问…

C++ | Leetcode C++题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…

详细带你彻底搞懂 Spring Security 6.0 的实现原理

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 Spring Security 6.0是一个功能强大且可扩展的身份验证和访问控制框架&#xff0c;它用于保护基于Java的应用程序。其主要目标是提供一个全面的安全解决方案&#xff0c;包括身份验证、授权、防止跨站请…

IPv6过渡技术之网络工程师软考中级

IPv6过渡技术 IPv4/IPv6双栈 1.设备支持IPV4/IPv6&#xff0c;IPv4及IPv6在网络中独立部署&#xff0c;在一段时间内并存。对现有IPv4业务影响较小。 2.演进方案相对简单、易理解。网络规划设计工作量相对更少 3.现有软硬件(网络设备、终端、操作系统等)已经有很大一部分支持…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

用excel能做出这些报表吗?

用excel能做出这些报表吗&#xff1f; 有什么办法不安装OFFICE也能显示出来&#xff1f;

SQLLIte [SQLITE_BUSY] The database file is locked (database is locked) 问题

SqlLite是一个嵌入式轻量级文件数据库 侵入式 。 方便&#xff0c;不需要安装数据库&#xff0c;仅需要一个目录轻量级。支持的数据量不大。单文件。有文件锁。标题出现的问题就是触发了锁。 所以&#xff0c;sqlLite的锁是库锁&#xff0c;因为sqlLite的数据库就是一个后缀为…

解释Spring Data中的PagingAndSortingRepository

PagingAndSortingRepository是Spring Data仓库层次结构中的一个接口&#xff0c;它扩展自CrudRepository接口。正如其名称所暗示的&#xff0c;PagingAndSortingRepository为实现分页和排序的数据访问提供了额外的方法。通过使用这个接口&#xff0c;你可以更容易地管理和访问大…

ARM体系结构和接口技术(十)按键中断实验

文章目录 一、按键中断实验&#xff08;一&#xff09;分析按键电路图&#xff08;二&#xff09;芯片手册 二、按键中断实验分析&#xff08;一&#xff09;查看所有外设的总线以及寄存器基地址&#xff08;二&#xff09;RCC章节&#xff08;三&#xff09;GPIO章节&#xff…

Known框架实战演练——进销存业务单据

本文介绍如何实现进销存管理系统的业务单据模块&#xff0c;业务单据模块包括采购进货单、采购退货单、销售出货单、销售退货单4个菜单页面。由于进销单据字段大同小异&#xff0c;因此设计共用一个页面组件类。 项目代码&#xff1a;JxcLite开源地址&#xff1a; https://git…

2024最新Uniapp的H5网页版添加谷歌授权验证

现在教程不少&#xff0c;但是自从谷歌升级验证之后&#xff0c;以前的老教程就失效了&#xff0c;现在写一个新教程以备不时之需。 由于众所周知的特殊原因&#xff0c;开发的时候一定注意网络环境&#xff0c;如果没有梯子是无法进行开发的哦~ clientID的申请方式我就不再进…