408代码类复习--八大排序

Author:Joanh_Lan

Personal Blog Links:Joanh_LanのCSDN博客
备注:

个人复习版本,能用OJ检测的均已检测通过

不保证完全正确,理性参考(不背锅i哦)

(:(:(:

欢迎阅读!!!
如果需要电子版请私信我,这个专栏不收取任何费用。

八大排序

quick_sort

平均时间复杂度: O( n l o g 2 n nlog_2{n} nlog2n)

最坏时间复杂度:O( n 2 n^2 n2)

快速排序通常明显快于其他排序算法,但对于相等元素的顺序可能会被改变,稳定性较差,它的时间复杂度为 O( n l o g 2 n nlog_2n nlog2n),**空间复杂度为 O( l o g 2 n log_2n log2n) **有栈开销。

// quick_sort#include <iostream>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE];
void myswap(int& a, int& b) {int t = a;a = b;b = t;
}
int partition(int arr[], int low, int high) {int standard = arr[low];int l = low, r = high;while (l < r){while (l < r && arr[r] >= standard)	r--;while (l < r && arr[l] <= standard) l++;if (l < r)myswap(arr[l], arr[r]);}myswap(arr[l], arr[low]);return l;
}
void quick_sort(int arr[], int low, int high) {if (low >= high)	return;int idx = partition(arr, low, high);quick_sort(arr, low, idx - 1);quick_sort(arr, idx + 1, high);
}
int main()
{int n;	cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];quick_sort(arr, 0, n - 1);for (int i = 0; i < n; i++)	cout << arr[i] << " \n"[i == n-1];
}

quick_selection

寻找第k小数

quick_sort改一下就成

时间复杂度:O(n)

空间复杂度:O( l o g 2 n log_2n log2n) 注:可以优化成 O(1)

#include <iostream>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE];
int quick_selection(int arr[], int low ,int high, int k){int standard = arr[low];int l = low, r = high;while (l < r){while (l < r && arr[r] >= standard)	r--;while (l < r && arr[l] <= standard)	l++;if (l < r)	swap(arr[l], arr[r]);}swap(arr[l], arr[low]);if (l == k - 1)	return arr[l];else if (l < k - 1)	return quick_selection(arr, l + 1, high, k);else return quick_selection(arr, low, l - 1, k);
}
int main()
{int n;	cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];int k; 	cin >> k;int	idx = quick_selection(arr, 0, n - 1, k);cout << arr[idx] << '\n';
}

若想将空间优化成O(1)

参考下述代码

     int quick_select(vector<int>& nums, int l, int r, int k) {while(true) {if (l == r) return nums[l];int i = l - 1, j = r + 1, x = nums[l + r >> 1]; // 选取 nums[l], 极端样例 时间会很久// int x = nums[rand() % (r - l + 1) + l], i = l - 1, j = r + 1; // 随机选取while (i < j) {do i ++ ; while (nums[i] > x);do j -- ; while (nums[j] < x);if (i < j) swap(nums[i], nums[j]);}// 将 递归 的 参数l,r,k变化 改为 while 循环中 l,r,k 更新, 省去递归栈空间// if (k <= j - l + 1) return quick_select(nums, l, j, k);if (k <= j - l + 1) r = j;// else return quick_select(nums, j + 1, r, k - (j - l + 1));else k = k - (j - l + 1), l = j + 1; // 注意 k更新用到 l, 所以 l 更新应该在 k更新之后}}作者:YXC

merge_sort

归并排序是一种分治算法,它将数据分为两个子序列并对每个子序列进行排序,最后将两个有序子序列合并成一个有序序列。归并排序的稳定性很好,即相等元素的顺序会被保持不变。归并排序的时间复杂度为 O( n l o g 2 n nlog_2n nlog2n)空间复杂度为 O(n)

#include <iostream>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE];
int t[MAXSIZE]; //辅助数组 
void merge_sort(int arr[], int low, int high){if (low >= high)	return;int mid = (low + high) >> 1;merge_sort(arr, low, mid);merge_sort(arr, mid + 1, high);int i = low, j = mid + 1, idx = 0;while(i <= mid && j <= high){if (arr[i] < arr[j])	t[idx++] = arr[i++];else t[idx++] = arr[j++];}while (i <= mid)	t[idx++] = arr[i++];while (j <= high)	t[idx++] = arr[j++];for (int p = low, q = 0; p <= high; p++, q++)arr[p] = t[q];return;
} 
int main()
{int n;	cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];merge_sort(arr, 0, n - 1);for (int i = 0; i < n; i++)	cout << arr[i] << " \n"[i == n - 1];
}

merge_sort在求逆序对个数的时候是一把利器

只需要做以下修改:

int ans = 0;//在最前面定义while(i <= mid && j <= high){if (arr[i] < arr[j])	t[idx++] = arr[i++];else {ans += mid - i + 1;t[idx++] = arr[j++];}}ans的值就是逆序对的个数

easy_selection_sort

时间复杂度: O( n 2 n^2 n2)

空间复杂度:O(1)

#include <iostream>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE]; 
void easy_selection_sort(int arr[], int low ,int high){for (int i = low; i <= high; i++){int idx = i;for (int j = i; j <= high; j++)if (arr[j] < arr[idx])	idx = j;swap(arr[i], arr[idx]);}return;
}
int main()
{int n;	cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];easy_selection_sort(arr, 0, n - 1);for (int i = 0; i < n; i++)	cout << arr[i] << " \n"[i == n - 1];
}

insert_sort

插入排序是一种简单的排序算法,它将数据分为已排序和未排序两个部分,每次从未排序部分取出一个元素,并将其插入到已排序部分的合适位置。插入排序的稳定性是很好的,它对于相等的元素是保持原来的顺序不变。插入排序的时间复杂度为 O( n 2 n^2 n2),空间复杂度为 O(1),在数据规模较小的情况下表现良好。

  • 最好时间复杂度:O(n) 序列的前面已经是有序的情况
  • 平均时间复杂度:O( n 2 n^2 n2)
  • 最差时间复杂度:O( n 2 n^2 n2) 倒序
#include <iostream>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE];
void insert_sort(int arr[], int low ,int high){for (int i = low + 1; i <= high; i++){if (arr[i] >= arr[i - 1])	continue;int j = i;while (j != 0 && arr[j] < arr[j - 1])	swap(arr[j], arr[j - 1]), j--;}return;
}
int main()
{int n;	cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];insert_sort(arr, 0, n - 1);for (int i = 0; i < n; i++)	cout << arr[i] << " \n"[i == n - 1];
}

shell_sort

希尔排序的稳定性较差,即相等元素的顺序可能会被改变,空间复杂度为 O(1)。在数据规模较大时表现良好。

希尔排序的平均时间复杂度通常被认为是介于O(n)和O( n 2 n ^ 2 n2)之间,具体取决于选取的间隔序列。在实际应用中,常用的希尔排序的时间复杂度为O( n 1 . 3 n^1.3 n1.3),这是基于经验得出的一个较好的估计。但需要注意的是,希尔排序的时间复杂度并不是一个确定的值,而是与输入数据的特性和选取的间隔序列有关。

#include <iostream>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE];
void shell_sort(int arr[], int low ,int high){for (int d = (high - low + 2) >> 1; d >= 1; d = (d + 1) >> 1){for (int i = low + d; i <= high; i += d){if (arr[i] >= arr[i - d])	continue;int j = i;while (j - d >= 0 && arr[j] < arr[j - d])swap(arr[j], arr[j - d]), j -= d;}if (d == 1) return;}
}
int main()
{int n;	cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];shell_sort(arr, 0, n - 1);for (int i = 0; i < n; i++)	cout << arr[i] << " \n"[i == n - 1];
}

Bubble sort

It’s too simple to explain

冒泡排序是一种简单的排序算法,它通过重复地交换相邻元素将未排序部分的最大元素“冒泡”到已排序部分的末尾。冒泡排序的稳定性很好,即相等元素的顺序会被保持不变。冒泡排序的时间复杂度为 O($n^2)空间复杂度为 O(1)

// 冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++) // 外层循环控制比较轮数{for (int j = 1; j < n - i; j++) // 内层循环从第一个元素开始,依次比较相邻的两个元素{if (a[j - 1] > a[j]) // 如果前一个元素大于后一个元素,则交换它们的位置{Swap(&a[j - 1], &a[j]);}}}
}

heap_sort

堆排序是一种通过维护一个二叉堆来实现的排序算法,它将未排序部分的最大元素与已排序部分的末尾交换,然后重建堆,稳定性较差。堆排序的时间复杂度为 O( n l o g 2 n nlog_2 n nlog2n)空间复杂度为 O(1),但对于相等元素的顺序可能会被改变。

// 维护小根堆,大根堆类别即可
#include <iostream>
#define MAXSIZE 100009
using namespace std;
int heap[MAXSIZE];
int cnt = 0;void down(int rt)
{if (rt > cnt)	return;int idx = rt;int lchild = rt << 1;int rchild = lchild + 1;if (lchild <= cnt && heap[idx] > heap[lchild])	idx = lchild;if (rchild <= cnt && heap[idx] > heap[rchild])	idx = rchild;if (idx != rt)swap(heap[rt], heap[idx]), down(idx);
}int main()
{int n;	cin >> n;cnt = n;for (int i = 1; i <= n; i++)	cin >> heap[i];for (int i = cnt >> 1; i >= 1; i--)	down(i);for (int i = 1; i <= n; i++) {cout << heap[1] << " \n"[i == n];heap[1] = heap[cnt--];down(1);}
}

counting_sort

计数排序是一种非比较的排序算法,它的思想是统计每个元素在数组中出现的次数,并根据元素出现的次数依次输出元素。计数排序的稳定性很不好,就没有顺序可言。计数排序的时间复杂度为 O(n+k),其中,k是待排序数组中最大元素减去最小元素再加1的值空间复杂度也是 O(n+k)

#include <iostream>
#include <cmath>
#define MAXSIZE 100009
using namespace std;
int arr[MAXSIZE];void counting_sort(int arr[], int low, int high){int min_n = 0x3f3f3f3f, max_n = (int)((unsigned int)(1<<32 - 1));for (int i = low; i <= high; i++)	min_n = min(min_n, arr[i]), max_n = max(max_n, arr[i]);int len = max_n - min_n + 1;int *b = (int*)malloc(sizeof(int) * len);for (int i = 0; i < len; i++) b[i] = 0;for (int i = low; i <= high; i++)b[arr[i] - min_n]++;for (int i = 0; i < len; i++)while (b[i]--)	cout << i + min_n << ' ';
}int main()
{int n; cin >> n;for (int i = 0; i < n; i++)	cin >> arr[i];counting_sort(arr, 0, n - 1);
}

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

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

相关文章

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型&#xff1a; 数据库分为网状数据库&#xff0c;层次数据库&#xff0c;关系型数据库和非关系型数据库四种。 目前市场上比较主流的是&#xff1a;关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句&#xff08;SQL&#xff09;对关系型数据库进行…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

合法三元数量计算

问题描述 小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题&#xff0c;给定一个长度为n的数组a&#xff0c;他们想要找出符合特定条件的三元组 (i, j, k)。具体来说&#xff0c;三元组要满足 0 < i < j < k < n&#xff0c;并且 max(a[i], a[…

wsl虚拟机中的dockers容器访问不了物理主机

1 首先保证wsl虚拟机能够访问宿主机IP地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…

如何删除Kafka中的数据以及删除topic

如何删除Kafka数据已经以及删除topic呢&#xff1f; 1、删除数据 先启动Kafka实例 docker exec -it kafka-0 /bin/bash #进去容器 rm -rf /bitnami/kafka/data/* #删除数据 exit #退出如果删除失败&#xff0c;可能是数据不存在于/bitnami/kafka/data&#xff0c;使用 cd /o…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

【2024最新】基于springboot+vue的疫情网课管理系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画

Python Turtle召唤童年&#xff1a;喜羊羊与灰太狼之懒羊羊绘画 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 小时候&#xff0c;每次打开电视…

SpringBoot学习记录(四)之分页查询

SpringBoot学习记录&#xff08;四&#xff09;之分页查询 一、业务需求1、基本信息2、请求参数3、相应数据 二、传统方式分页三、使用PageHelper分页插件 一、业务需求 根据条件进行员工数据的条件分页查询 1、基本信息 请求路径&#xff1a; /emps 请求方式&#xff1a; …

6. Spring Cloud Gateway网关超详细内容配置解析说明

6. Spring Cloud Gateway网关超详细内容配置解析说明 文章目录 6. Spring Cloud Gateway网关超详细内容配置解析说明前言1 Spring Cloud Gateway 概述1.1 Spring Cloud Gateway网关 的核心功能1.2 Spring Cloud Gateway VS Zuul 的区别1.3 Spring Cloud Gateway 的基本原理1.4 …

远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接

前言&#xff1a;大家好&#xff01;今天我要教你们如何在树莓派5上安装Raspberry Pi OS&#xff0c;并配置SSH和VNC权限。通过这些步骤&#xff0c;你将能够在Windows电脑上使用VNC Viewer&#xff0c;结合Cpolar内网穿透工具&#xff0c;实现长期的公网远程访问管理本地树莓派…

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

【机器学习】回归模型(线性回归+逻辑回归)原理详解

线性回归 Linear Regression 1 概述 线性回归类似高中的线性规划题目。线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合&#xff08;加减乘除&#xff09;起来&#xff0c;得到的结果和目标接近。 线性回归分为一元线性回归和多元线性回归。 2 一元线…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力&#xff0c;远远超过了经典计算机的能力。当与人工智能&#xff08;AI&#xff09;集成时&#xff0c;量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题&#xff0c;这对优化和…

STM32F103 GPIO和串口实战

本节我们将会对STM32F103的硬件资源GPIO和串口进行介绍。 一、GPIO 1.1 电路原理图 LED电路原理图如下图所示&#xff1a; 其中&#xff1a; LED1连接到PA8引脚&#xff0c;低电平点亮&#xff1b;LED2连接到PD2引脚&#xff0c;低电平点亮&#xff1b; 1.2 GPIO引脚介绍 STM32…

FileProvider高版本使用,跨进程传输文件

高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…

国产linux系统(银河麒麟,统信uos)使用 PageOffice 动态生成word文件

PageOffice 国产版 &#xff1a;支持信创系统&#xff0c;支持银河麒麟V10和统信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飞腾、鲲鹏、麒麟等&#xff09;、龙芯&#xff08;LoogArch&#xff09;芯片架构。 数据区域填充文本 数…