冒泡排序,选择排序,插入排序,希尔排序,基数排序,堆排序代码分析(归并排序和快速排序后续更新)
所有的算法都是这样,算法思想最重要,其次是实现过程,最后才是实现的代码
上战伐谋,我们只要明确了其算法思想和实现过程,所有算法都是纸老虎,所有算法题都是纸老虎
笔者才疏学浅,也算是刚刚接触算法,暂时总结不出思想,但是笔者相信只要坚持下去,总有一天一定可以领悟到
冒泡排序和选择排序
手撕冒泡排序和选择排序
之前写的这篇博客讲的很清楚了,这里只展示代码
public static void bubbleSort(int[] arr){for(int j = 0; j<arr.length; j++){for(int i = 0;i<arr.length - 1; i++) {// 唯一需要注意的点,循环n-1次,让i+1遍历到数组末尾即可if(arr[i+1] > arr[i]) {int temp = arr[i];arr[i] = arr[i+1];arr[i+1] = arr[i];}}}
}
public static void selectSort(int[] arr){for (int i = 0; i < arr.length; i++) {// 假设第一个是最小的,所以当然minIndex = iint min = arr[i];int minIndex = i;// 内层抓数字和未排好的数字序列的第一个数字进行比较,下标当然从i+1开始for (int j = i + 1; j < arr.length; j++) {if (arr[j] < min) {// 替换新的minmin = arr[j];// 记录更小数字的下标minIndex = j;}}// 普通交换/*int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;*/// 进阶交换,我们发现arr[minIndex] = min,所以不需要再定义一个中间变量temp// 同时,arr[i]只有一份,所以不能先辅助arr[i]arr[minIndex] = arr[i];arr[i] = min;}}
}
插入排序
插入排序,不断插入后续数字并且保证有序性,所以被称为插入排序
要点:
- 默认第一个数字有序,逐渐递增有序序列
- 内层循环实际上是冒泡排序的倒排
public static void insertSort(int[] arr) {// 因为默认第一个数字有序,所以i从1开始,i指针循环n-1次for (int i = 1; i < arr.length; i++) {// j从i开始,逐渐向后移动// 因为比较的是arr[j]和arr[j-1],所以j要>=1 for (int j = i; j >= 1; j--) {// 如果arr[j]前一个数字比arr[j]大,就交换位置if (arr[j] < arr[j - 1]) {int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;}}}}
希尔排序
插入排序存在插入的小数字越小,位置越靠后,后移的次数越多的问题,实际上会形成很多多余的交换位置
希尔排序就是为了解决这个问题而诞生的,在**“最后的交换”**之前,先让大数字尽可能往后移动,小数字尽可能往前移动
这里的**“最后的交换”**,实际上就是插入排序
是的,你没听错,希尔排序的最后一轮交换,实际上就是插入排序
希尔排序运用了分组的思想
先分成n/2组,然后是n/4……最后step = 1时,就是插入排序
public static void shellSort(int[] arr) {int step = arr.length / 2;// 只要步长不是0,就一直循环while (step != 0) {// i指针先从步长位置开始循环for (int i = step; i < arr.length; i++) {// 比较arr[j]和arr[j+step]的大小,保证组内有序for (int j = i - step; j >=0; j--) {if (arr[j] > arr[j + step]) {int temp = arr[j];arr[j] = arr[j + step];arr[j + step] = temp;}}}// 每次循环步长减半step /= 2;}}
基数排序
又叫桶排序
排序方法很简单,就是先比较数字的个位,然后比较十位,比较百位……,最后就能排号序
但是实现起来比较复杂,有很多需要注意的细节
个人认为,八大排序里面,除了快排和归并,其次最难写的就是基数排序
public static void bucketSort(int[] arr) {int max = arr[0];for (int ele : arr) {max = Math.max(ele, max);}int maxLength = ("" + max).length();// 1. 先定义好0~9十个桶,桶高是数组的长度int[][] baseBucket = new int[10][arr.length];// 2. 桶计数器int[] bucketCount = new int[10];for (int m = 1; m <= maxLength; m++) {int m1 = 1;// 循环数组获取个位数据,放到桶中for (int i = 0; i < arr.length; i++) {// 求余数int left = (arr[i] / m1) % 10;// 查询目前桶中本列下一个插入位置int height = bucketCount[left];// 插入baseBucket[left][height] = arr[i];// 桶计数器+1bucketCount[left] = ++bucketCount[left];}m1 = m1 * 10;// 下策:遍历二维数组取出数字// 上策:遍历桶计数器,不等于0就放进arrint i = 0;for (int j = 0; j < 10; j++) {if (bucketCount[j] != 0) {for (int k = 0; k < bucketCount[j]; k++) {arr[i] = baseBucket[j][k];i++;}// 下策:新创建一个桶计数器// 上策:清空桶计数器// 用完就清空bucketCount[j] = 0;}}}}
堆排序
堆排序(排序思想+排序流程+代码)
这篇博客写的很清楚了,这里只展示代码
public static void heapSort(int[] arr) {for (int p = arr.length; p >= 0; p--) {sort(arr, p, arr.length);}for (int i = arr.length - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;sort(arr, 0, i);}}public static void sort(int[] arr, int parent, int length) {int maxChild = 2 * parent + 1;while (maxChild < length) {int rightChild = maxChild + 1;if (rightChild < length && arr[rightChild] > arr[maxChild]) {maxChild = rightChild;}if (arr[parent] < arr[maxChild]) {int temp = arr[parent];arr[parent] = arr[maxChild];arr[maxChild] = temp;parent = maxChild;maxChild = 2 * maxChild + 1;} else {break;}}}
相关文章:
冒泡排序,选择排序,插入排序,希尔排序,基数排序,堆排序代码分析(归并排序和快速排序后续更新)
所有的算法都是这样,算法思想最重要,其次是实现过程,最后才是实现的代码 上战伐谋,我们只要明确了其算法思想和实现过程,所有算法都是纸老虎,所有算法题都是纸老虎 笔者才疏学浅,也算是刚刚接…...
从入门到精通:NTP卫星时钟服务器技术指南
从入门到精通:NTP卫星时钟服务器技术指南 从入门到精通:NTP卫星时钟服务器技术指南 一、 产品功能 卫星时钟服务器是一款采用GPS或北斗卫星提供高精度网络时间服务的产品。卫星天线安装简便(根据天线所放位置提示实时卫星颗数)&a…...
OpenResty基于来源IP和QPS来限流
Nginx 经典限流法 ngx_http_limit_req_module 和 ngx_http_limit_conn_module,可以在代理层面对服务进行限流和熔断。 http {# 请求限流定义1:# - $binary_remote_addr:限制对象(客户端)# - zone:定义限制(策略)名称# - 10m:用十…...
面对AI技术创业的挑战以及提供给潜在创业者的一些建议
面对AI创业的挑战 AI技术创业虽然机遇众多,但也面临不少挑战,理解这些挑战并寻找应对策略是创业成功的关键。 技术挑战 AI技术的快速发展意味着创业者需要持续学习和更新知识库,以保持技术竞争力。同时,AI项目往往需要处理大量数…...
`require`与`import`的区别
require与import的区别主要体现在以下几个方面: 1.加载时间不同。require是在运行时加载模块,这意味着模块的加载和执行可以在代码的任何地方进行,也可以在运行时根据条件动态地加载不同的模块;import是在编译时加载模块…...
中介者模式:优雅解耦的利器
在软件设计中,随着系统功能的不断扩展,对象之间的依赖关系往往会变得错综复杂,导致系统难以维护和扩展。为了降低对象之间的耦合度,提高系统的可维护性和可扩展性,设计模式应运而生。中介者模式(Mediator P…...

Ubuntu20.04安装MatlabR2018a
一、安装包 安装包下载链接 提取码:kve2 网上相关教程很多,此处仅作为安装软件记录,方便后续软件重装,大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后,如下图所示: 2. 挂载镜像并安装 2…...

基于SpringBoot的图书馆管理系统设计与实现
介绍 基于:java8 SpringBoot thymeleaf MySQL8.0.17 mybatis-plus maven Xadmin 实现图书馆管理系统 系统要实现如下的基本管理功能: (1)用户分为两类:管理员,一般用户。 (2)…...

网易云首页单页面html+css
网页设计与网站建设作业htmlcss 预览 源码查看https://hpc.baicaitang.cn/2083.html...
acwing算法提高之图论--最小生成树的典型应用
目录 1 介绍2 训练 1 介绍 本专题用来记录使用prim算法或kruskal算法求解的题目。 2 训练 题目1:1140最短网络 C代码如下, #include <iostream> #include <cstring>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N…...

springcloud基本使用二(远程调用)
创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…...
代码随想录刷题day42| 01背包理论基础分割等和子集
文章目录 day41学习内容一、 01背包之二维数组解法1.1、什么是01背包1.2、动态规划五部曲1.2.1、 确定dp数组(dp table)以及下标的含义1.2.2、确定递推公式1.2.3、 dp数组如何初始化1.2.4、确定遍历顺序1.2.5、计算并返回最终结果 二、 01背包之一维数组…...

Python文件操作命令
文件操作 我知道你最近很累,是那种看不见的、身体上和精神上的疲惫感,但是请你一定要坚持下去。就算无人问津也好,技不如人也好,千万别让烦躁和焦虑毁了你的热情和定力。别贪心,我们不可能什么都有,也别灰心…...

CSS面试题---基础
1、css选择器及优先级 选择器优先级:内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意: !important优先级最高; 如果优先级相同,则最后出现的样式生效; 继承得到的样式优先…...

OpenHarmony实战开发-分布式数据管理
介绍 本示例展示了在eTS中分布式数据管理的使用,包括KVManager对象实例的创建和KVStore数据流转的使用。 通过设备管理接口ohos.distributedDeviceManager ,实现设备之间的kvStore对象的数据传输交互,该对象拥有以下能力详见 ;1、注册和解…...

微服务(基础篇-007-RabbitMQ部署指南)
目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址: 05-Rab…...

C语言一维数组及二维数组详解
引言: 小伙伴们,我发现我正文更新的有些慢,但相信我,每一篇文章真的都很用心在写的,哈哈,在本篇博客当中我们将详细讲解一下C语言中的数组知识,方便大家后续的使用,有不会的也可以当…...

11.图像边缘检测的原理与实现
数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征,所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...

RVM安装ruby笔记
环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…...
电力系统负荷预测方法
电力系统负荷是什么? 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础,以特定的数学方法或者建立数学模型的方式为手段,通过对电力负荷历史数据进行分析,对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...