十大排序算法模板

☆* o(≧▽≦)o *☆嗨~我是小奥🍹
📄📄📄个人博客:小奥的博客
📄📄📄CSDN:个人CSDN
📙📙📙Github:传送门
📅📅📅面经分享(牛客主页):传送门
🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正!
📜 如果觉得内容还不错,欢迎点赞收藏关注哟! ❤️

文章目录

  • 排序算法
    • 冒泡排序
    • 选择排序
    • 插入排序
    • 希尔排序
    • 归并排序
    • 快速排序
    • 堆排序
    • 计数排序
    • 基数排序
    • 桶排序

排序算法

十大排序算法指的是在计算机科学中被广泛使用,效率较高且实现简单的十个排序算法。下面是这十种排序算法的简要介绍:

(1)冒泡排序(Bubble Sort):交换相邻元素,最大或最小的元素经过n-1次比较后,就会排在数组的最后一位。

(2)选择排序(Selection Sort):每次寻找未排序序列中的最小值,并将其放在已排序序列的末尾。

(3)插入排序(Insertion Sort):对于未排序序列中的每一个元素,将其插入到已排序序列中的合适位置。

(4)希尔排序(Shell Sort):采用分组策略,先将待排序序列拆分为n/2个子序列,进行插入排序,然后逐渐缩小子序列的长度,直到子序列长度为1,即完成排序。

(5)归并排序(Merge Sort):将待排序序列不断二分,再将两个有序的子序列合并为一个有序序列,重复上述步骤,直到整个序列有序。

(6)快速排序(Quick Sort):选择一个基准元素,将序列中小于它的元素放在它的左边,大于它的元素放在右边,然后递归地对左右子序列进行快速排序。

(7)堆排序(Heap Sort):将待排序序列构建成一个堆,然后不断从堆顶取出最大值,并调整堆,直到取完所有元素。

(8)计数排序(Counting Sort):统计序列中每个元素出现的次数,然后根据统计信息对序列进行重排。

(9)桶排序(Bucket Sort):将整个区间划分为若干个桶,然后将元素按照大小分配到相应的桶中,在桶内使用其他的排序算法(如插入排序)进行排序。

(10)基数排序(Radix Sort):将待排序序列拆分为多个关键字,按照每个关键字进行排序,最终得到有序序列。

以上十种排序算法都有其独特的优势和适用场景,选择合适的排序算法可以提高程序的效率。

冒泡排序

	// 冒泡排序public static void bubblingSort(int[] nums) {int n = nums.length;for(int i = 0; i < n; i++) {for(int j = i + 1; j < n; j++) {if(nums[i] > nums[j]) {int t = nums[i];nums[i] = nums[j];nums[j] = t;}}}}// 双向冒泡排序public static void twoWaySort(int[] nums) {int l = 0, r = nums.length - 1;while(l < r) {for(int i = l + 1; i <= r; i++) {if(nums[l] > nums[i]) {nums[l] ^= nums[i];nums[i] ^= nums[l];nums[l] ^= nums[i];}}l++;for(int i = r - 1; i >= l; i--) {if(nums[r] < nums[i]) {nums[r] ^= nums[i];nums[i] ^= nums[r];nums[r] ^= nums[i];}}r--;}}

选择排序

	// 选择排序public static void selectSort(int[] nums) {int n = nums.length;for(int i = 0; i < n - 1; i++) {int minVal = i;for(int j = i + 1; j < n; j++) {if(nums[minVal] > nums[j]) {minVal = j;}}if(minVal != i) {int t = nums[i];nums[i] = nums[minVal];nums[minVal] = t;}}}

插入排序

	// 插入排序public static void insertSort(int[] nums) {int n = nums.length;for(int i = 1; i < n; i++) {int val = nums[i], j = i;while(j > 0 && val < nums[j - 1]) {nums[j] = nums[j - 1];j--;}nums[j] = val;}}

希尔排序

	// 希尔排序public static void shellSort(int[] nums) {int n = nums.length;for(int g = n >> 1; g > 0; g >>= 1) {for(int i = g; i < n; i++) {int x = nums[i];int j = 0;for(j = i; j >= g && nums[j - g] > x; j -= g) {nums[j] = nums[j - g];}nums[j] = x;}}}

归并排序

借鉴博客链接:(9条消息) java实现归并排序(详解)_java 归并排序_星辰与晨曦的博客-CSDN博客

介绍

归并排序先将待排序的数组不断拆分,直到拆分到区间里只剩下一个元素的时候。不能再拆分的时候。这个时候我们再想办法合并两个有序的数组,得到长度更长的有序数组。当前合并好的有序数组为下一轮得到更长的有序数组做好了准备。一层一层的合并回去,直到整个数组有序。

实现

	public static void mergeSort(int[] nums, int l, int r, int[] temp) {if(l >= r) return;int mid = l + r >> 1;mergeSort(nums, l, mid, temp);mergeSort(nums, mid + 1, r, temp);int k = 0, i = l, j = mid + 1;while(i <= mid && j <= r) {if(nums[i] < nums[j]) {temp[k++] = nums[i++];} else {temp[k++] = nums[j++];}}while(i <= mid) temp[k++] = nums[i++];while(j <= r) temp[k++] = nums[j++];for(i = l, j = 0; i <= r; i++, j++) {nums[i] = temp[j];}}

快速排序

介绍

实现

 	// 快速排序 递归版public static void quickSort(int[] nums, int l, int r) {if(l >= r) {return;}int i = l - 1, j = r + 1, x = nums[(l + r) / 2];while(i < j) {do i++; while(nums[i] < x);do j--; while(nums[j] > x);if(i < j) {int t = nums[i]; nums[i] = nums[j]; nums[j] = t;}}quickSort(nums, l, j);quickSort(nums, j + 1, r);}// 快速排序,非递归版public static void quickSortByStack(int[] nums, int l, int r) {Stack<Integer> s = new Stack<>();s.push(r);s.push(l);while(!s.isEmpty()) {int low = s.pop(), high = s.pop();int i = low, j = high;if(i >= j) {continue;}int pivot = nums[i];while(i < j) {while(i < j && nums[j] >= pivot) j--;nums[i] = nums[j];while(i < j && nums[i] < pivot) i++;nums[j] = nums[i];}nums[i] = pivot;s.push(high);s.push(i + 1);s.push(i - 1);s.push(low);}}

堆排序

import java.util.Scanner;
public class Main{static int N = 100010;static int[] h = new int[N];static int size;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();size = n;for(int i = 1; i < n + 1; i++) {h[i] = sc.nextInt();}// 建堆for(int i = n / 2; i != 0; i--)  down(i);while(k-- > 0) {System.out.print(h[1] + " ");h[1] = h[size];size--;down(1);}}// 下移public static void down(int u) {int t = u;if(2 * u <= size && h[2 * u] < h[t]) t = 2 * u;if(2 * u + 1 <= size && h[2 * u + 1] < h[t]) t = 2 * u + 1;if(t != u) {h[u] ^= h[t];h[t] ^= h[u];h[u] ^= h[t];down(t);}}
}		

计数排序

 	// 计数排序public static void countSort(int[] nums) {int n = nums.length;int[] t = new int[n];int maxV = nums[0];for(int i = 1; i < n; i++) {if(maxV < nums[i]) {maxV = nums[i];}}int[] count = new int[maxV + 1];for(int i = 0; i < n; i++) count[nums[i]]++;for(int i = 1; i <= maxV; i++) count[i] += count[i - 1];for(int i = n - 1; i >= 0; i--) {t[count[nums[i]] - 1] = nums[i];count[nums[i]]--;}for(int i = 0; i < n; i++) nums[i] = t[i];} 

基数排序

借鉴博客链接:(8条消息) java实现基数排序_基数排序java_其实我不想摆烂的博客-CSDN博客

介绍

属于分配式排序,又称桶子法或者bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。

基数排序的思想是,将所有待比较数值统一为同样的数值长度,数位较短的数前面补0,然后,从最低位开始,依次进行一次排序,这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

实现

	// 基数排序public static void radixSort(int[] nums) {// 找出数组中的最大值int max = nums[0];for(int i : nums) max = max > i ? max : i;// 计算最大值的位数int len = (max + "").length();// 桶的表示。十个桶处理 0-9 十个数字// 防止数据溢出,所以定义len长度的一维数组来存放每次排序后的序列// 经典的空间换时间概念int[][] bucket = new int[10][len];// 记录每个桶中放置数字的个数int[] bucketCount = new int[10];// 循环处理for(int i = 0, n = 1; i < len; i++, n *= 10) {// 第i轮对对应的位排序,第一次为个位,第二次为十位for(int j = 0; j < nums.length; j++) {int digit = (nums[j] / n) % 10;bucket[digit][bucketCount[digit]] = nums[j];bucketCount[digit]++;}}int idx = 0;for(int i = 0; i < bucketCount.length; i++) {if(bucketCount[i] != 0) {for(int j = 0; j < bucketCount[i]; j++) {nums[idx++] = bucket[i][j];}}bucketCount[i] = 0;}}

桶排序

借鉴博客链接:(8条消息) java实现桶排序(详细解析)桶排序java、信仰_的博客-CSDN博客

介绍

桶排序 (Bucketsort),是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(O(n))。

桶排序的思想是,若待排序的记录的关键字在一个明显有限范围内时,可设计有限个有序桶,每个桶只能装与之对应的值,顺序输出各桶的值,将得到有序的序列。简单来说,在我们可以确定需要排列的数组的范围时,可以生成该数值范围内有限个桶去对应数组中的数,然后我们将扫描的数值放入匹配的桶里的行为,可以看作是分类,在分类完成后,我们需要依次按照桶的顺序输出桶内存放的数值,这样就完成了桶排序。

实现

	public static void bucketSort(int[] nums) {int max = nums[0];for(int i : nums) max = max > i ? max : i;int[] bucket = new int[max + 1];for(int i : nums) bucket[i]++;int idx = 0;for(int i = 0; i < max + 1; i++ ) {for(int j = 0; j < bucket[i]; j++) {nums[idx++] = i;}}}

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

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

相关文章

本地一键部署grafana+prometheus

本地k8s集群内一键部署grafanaprometheus 说明&#xff1a; 此一键部署grafanaPrometheus已包含&#xff1a; victoria-metrics 存储prometheus-servergrafanaprometheus-kube-state-metricsprometheus-node-exporterblackbox-exporter grafana内已导入基础的dashboard【7个…

户外火光如何玩转?智能酒精壁炉安全使用攻略大揭秘!

在户外使用智能酒精壁炉是一个别致而令人惬意的选择&#xff0c;但在享受户外炉火带来的温馨时&#xff0c;也需要注意一些安全和使用细节。下面将介绍智能酒精壁炉在户外使用需要注意的事项。 智能酒精壁炉需放置在平坦、通风的户外场地&#xff0c;远离易燃物体&#xff0c;确…

Maven 搭建私服

一、Maven 私服简介 1.1 私服简介 Maven 私服是一种特殊的 Maven 远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 当然也并不是说私服只能建立在局域网&#xff0c;也有很多公…

网络部署实战具体学习内容总结

网络部署实战具体学习内容总结 &#x1f4bb;网络部署实战课程通常旨在教授学生如何规划、配置、维护和优化计算机网络。这些课程涵盖了广泛的主题&#xff0c;以确保学生具备网络部署和管理所需的技能。 网络部署实战课程具体学习内容&#x1f447; 1️⃣网络架构设计及网络原…

第一个Python程序_获取网页 HTML 信息[Python爬虫学习笔记]

使用 Python 内置的 urllib 库获取网页的 html 信息。注意&#xff0c;urllib 库属于 Python 的标准库模块&#xff0c;无须单独安装&#xff0c;它是 Python 爬虫的常用模块。 获取网页 HTML 信息 1) 获取响应对象 向百度&#xff08;http://www.baidu.com/&#xff09;发起…

九州金榜|孩子厌学是家庭教育原因还是学校教育原因?

孩子厌学&#xff0c;这是一个让所有家长的头疼的问题&#xff0c;尤其在看到别人家孩子是学霸的时候&#xff0c;就更会有种莫名其妙的伤感&#xff0c;然后回想自己的孩子&#xff0c;仿佛全都是缺点&#xff0c;家长要是有这种想法那就大错特错了&#xff0c;其实每个孩子都…

杨中科 .NETCORE EFCORE第七部分 一对一,多对多

一对一 一对一关系配置 1、builder.HasOne(o >o.Delivery).WithOne(d>d.Order).HasForeignKey(d>dOrderId); 2、测试插入和获取数据 示例 新建 Order 新建 Delivery DeliveryConfig OrderConfig 执行 迁移命令 查看数据库 测试数据插入 运行查看数据 多对多…

【Shell编程练习】编写 shell 脚本,打印 9*9 乘法表

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量&#xff0c;小于给定值时报警 猜大小 输入三个数并进行升序排序 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态 系列文章目录编写 shell 脚本,打…

软件测试|如何使用selenium处理下拉框?

简介 下拉框是网页表单中常见的元素之一&#xff0c;通常用于选择不同的选项。对于我们的自动化测试工作来说&#xff0c;操作下拉框是我们经常需要处理的元素&#xff0c;selenium作为我们最常使用的web自动化测试框架&#xff0c;也是支持我们对下拉框进行操作的。本文我们就…

【问题+解决】axios/vue/element/echarts引入报错

缘由 笔者在html页面引用vue来快速实现页面&#xff1b;<head></head>中通过<script>src""></script>方法引入&#xff0c;开始引入&#xff0c;应用都是正常&#xff0c;后来用了也没问题&#xff1b;奇怪的是&#xff0c;前几天发现htm…

代码随想录算法训练营第6天 | 242.有效的字母异位词 , 349. 两个数组的交集 , 202. 快乐数 , 1. 两数之和

哈希知识基础 文章链接&#xff1a;https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E8%A1%A8 242.有效的字母异位词 题目链接&#xff1a;https://leetcode.cn/problems/valid-anagram/description/…

Qt根据单价计算总价与进制转换

1.相关说明 二进制、十进制、十六进制间的相互转换 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete …

路由黑洞和黑洞路由的区别

路由黑洞&#xff1a; 路由黑洞是一种现象&#xff0c;一般是在网络边界做汇总回程路由的时候产生的一种不太愿意出现的现象&#xff0c;就是汇总的时候有时会有一些不在内网中存在的网段&#xff0c;但是又包含在汇总后的网段中&#xff0c;如果在这个汇总的边界设备上同时还配…

【SQL】SQL语法小结

相关资料 参考链接1&#xff1a;SQL 语法&#xff08;超级详细&#xff09; 参考链接2&#xff1a;史上超强最常用SQL语句大全 SQL练习网站&#xff1a;CSDN、牛客、LeetCode、LintCode SQL相关视频&#xff1a; 推荐书籍&#xff1a; 文章目录 数据分析对SQL的要求SQL语法简介…

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具&#xff0c;用于时间性能分析&#xff0c;主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。通过图形化界面查看应用程序的代码执行细节&#xff0c;包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈等信息。我们可…

Java、C#、Python间的Battle

一、编译原理和开发效率 编译速度&#xff1a; C# &#xff08;约大于等于&#xff09; JAVA > Python python的编译原理 前提&#xff1a;python 3.6 python不会直接编译源码 而是把源码直接扔给解释器&#xff0c;这种方式 使得python非常灵活&#xff0c;让它的开发效…

交通流量预测HSTGCNT:Hierarchical Spatio–Temporal Graph Convolutional

Hierarchical Spatio–Temporal Graph Convolutional Networks and Transformer Network for Traffic Flow Forecasting 交通流预测的层次时空图卷积网络和Transformer网络 Abstract 图卷积网络&#xff08;GCN&#xff09;具有图形化描述道路网络不规则拓扑结构的能力&#…

乳腺癌预测_EDA_Models

文章目录 **前言**数据介绍1.概述2.**关于数据集** 预测过程1.安装包2.加载库3.导入数据4.数据清洗5.EDA重复行缺失值单变量分析正态性检验双变量分析年龄与肿瘤大小(cm)肿瘤大小&#xff08;cm&#xff09;与诊断结果肿瘤大小&#xff08;cm&#xff09;与转移多元分析 6.预处…

QT软件在线安装与维护

一.安装 安装QT开发环境分离线安装和在线安装两种方式&#xff0c;具体步骤如下&#xff1a; QT官网注册账号----下载安装包-----安装-----选择要安装的版本与开发包----版本维护 注意&#xff1a;Qt5.14.2是最后提供二进制安装包的版本&#xff0c;后面的版本都需要在线安装…

Linux学习记录——사십일 高级IO(2)--- Select型服务器

文章目录 1、思路2、select接口3、实现1、准备工作2、实现等待多个fd3、辨别连接和简单处理读事件4、简单处理写、读事件 4、特点 1、思路 select就是多路转接IO。select能以某种形式&#xff0c;等待多个文件描述符&#xff0c;只要有哪个fd有数据就可以读取并全部返回。就绪…