排序算法1---冒泡、插入、希尔排序

VBA16排序算法(冒泡/选择/插入/希尔) VBA16基本排序(冒泡排序/选择排序/插入排序/希尔排序) 阅读详情

1.冒泡排序

  • 思想:在一趟中找到最大值,放到末尾,接着走一趟寻找最大值,放到倒数第二位,循环一直到最后一位。
  • 改进:如果已经排好序,就不需要继续循环了。


public class Solution {
	   // 如果中间已经排好
	   public int[] bubble_sort(int[] arr) {
		   if (arr.length == 0 || arr == null) return null;
		   int count = 0;
		   for (int i = arr.length-1; i > 0; i-- ) {
		   // 如果最优的话只需要在这里走一趟
			   for (int j = 0; j < i; j++) {
				   if (arr[j] > arr[j+1]) {
					   count = 1;
					   swap(arr, j, j+1);
				   }
			   }
			   if (count == 0) break;
		   }    
		   return arr;
	   }
	   public void swap(int[] arr, int i, int j) {
		   int tmp = arr[i];
		   arr[i] = arr[j];
		   arr[j] = tmp;
	   }
	public static void main(String[] args) {
		Solution so = new Solution();
		int[] arr = {5, 4, 3, 2, 1};
		int[] newArr = so.bubble_sort(arr);
		if (newArr == null) return;
		for (int t : newArr) {
			System.out.print(t + " ");
			}	
		}
}

在这里插入图片描述
时间复杂度最优O(n),只需要走一趟,最坏是O(n^2),因为数组是逆序的
它是稳定的,因为遇到相等的数,不改变顺序
用冒泡排序处理单向链表,这种需要交换元素的,是没问题的。

2.插入排序

  • 思想:当插入一个新的元素时,比较大小,如果否合条件,一个个的往后错


public class Solution {
	   // 如果中间已经排好
	   public int[] insert_sort(int[] arr) {
		   if (arr.length == 0 || arr == null) return null;
		   int i = 1, j = 1;
		   for (i = 1; i < arr.length; ++i) {
			   int tmp = arr[i];
			   // 是插入元素和每个之前的元素比大小
			   // 符合要求的就往后移一位
			   // 不符合要求就停止
			   for (j = i; j > 0 && arr[j - 1] > tmp; --j) {
				   	  // 不符合要求是 arr[j-1] <= tmp
					  arr[j] = arr[j - 1];
				  }
			   arr[j] = tmp;
		   }   
		   return arr;
	   }
	   
	public static void main(String[] args) {
		Solution so = new Solution();
		int[] arr = {5, 4, 3, 2, 1};
		int[] newArr = so.insert_sort(arr);
		if (newArr == null) return;
		for (int t : newArr) {
			System.out.print(t + " ");
			}	
		}
}

在这里插入图片描述
时间复杂度最优O(n),只需要走一趟,最坏是O(n^2),因为数组是逆序的
排序算法是稳定的
插入排序不能处理单向链表,其他和冒泡排序差不多。

3、希尔排序

  • 思想:利用一个增量序列,根据设定的间隔远距离交换两个元素,内部使用的是插入排序


public class Solution {
	   // 如果中间已经排好
	   public int[] shell_sort(int[] arr) {
		   if (arr.length == 0 || arr == null) return null;
		   int len = arr.length;
		   int i = len / 2, j = len / 2;
		   for (int k = len / 2; k >=1 ; k /= 2) {
			   // 这里是间隔元素来比
			   for (i = k; i < arr.length; ++i) {
				   int tmp = arr[i];
				   // j >= k, 最后一个元素也是需要计算的
				   for (j = i; j >= k && arr[j - k] > tmp; j -= k) {
					   	  // 不符合要求是 arr[j-1] <= tmp
						  arr[j] = arr[j - k];
					  }
				   arr[j] = tmp;
			   }
		   }
		   return arr;
 }
	 
	public static void main(String[] args) {
		Solution so = new Solution();
		int[] arr = {81, 94, 11, 96, 12, 35, 17, 95, 28, 58, 41, 75, 15};
		int[] newArr = so.shell_sort(arr);
		if (newArr == null) return;
		for (int t : newArr) {
			System.out.print(t + " ");
			}	
		}
}

== 时间复杂度为O(nlogn+n^2),所以时间复杂度为 O(n^2)==

  • 如果增量序列不互质,那么希尔排序就不起作用
  • 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的
Transformer模型在语义通信中的实战应用:从信源编码到端到端优化 本文深入探讨了Transformer模型在语义通信中的实战应用,从信源编码到端到端优化。文章分析了Transformer凭借其强大的全局依赖建模能力,如何成为实现高效语义提取与传输的理想架构,并提供了构建可端到端训练系统的具体实现思路与评估方法,旨在为下一代智能通信系统提供技术参考。 阅读详情

相关推荐

大数据分析工具Power BI(二):Power BI下载安装和模块介绍

首先在Microsoft官方网站上下载PowerBI Desktop,然后进行安装。id=58494点击"Next"后会弹出下载框,进行下载即可,下载好的PowerBI名称为"PBIDesktopSetup_x64.exe",也可以在"资料"中获取安装包,双击安装包即可安装。

Lansonli(蓝深李)的博客 2322

关于希尔排序的一大坑,与冒泡排序有关千万注意

首先看一下希尔排序的原理: 原理图解 : 说明: 1.首先希尔排序的核心思想与算法是插入排序,虽然看起来想冒泡排序的两两互换,但请注意实际上并不是两两互换它只是像而已,由此产生了一个非常严重的误区,有的人写着写着就把希尔排序的核心算法写成冒泡排序的两两互换了,实际上他的核心应该是按步长抽数,将抽到的数排序(使用插入排序方法)并按顺序塞回原来的位置,图中每一行为一个循环,而不是从左到右每隔几个步长进行两两互换,千万要注意。 接下来就给大家举个反例:原文链接排序:希尔排序(算法...

Error的博客 1677

【AMD | Docker】超级全面版本:在Docker中验证AMD GPU移动显卡可用性的方法

1. 安装ROCm Docker支持 ■AMD GPU驱动 ■ROCM ■Docker 2. 配置Docker使用ROCm 3. 使用官方ROCm Docker镜像 4. 使用Docker CLI参数访问GPU

静谧、淡雅 688

希尔排序

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。 public class ShallSort { public static void main(String[] args) { int[]

ChengChengxn的博客 439

【项目实战】DevOps制品管理之JFrog Artifactory介绍

JFrog Artifactory是一款领先的二进制软件制品仓库管理工具,由JFrog公司开发。

奶爸的编程之路,也就一周冷个三天 1356

RH850 GreenHillSoftware Install

IDE一次链接到一个Compiler/Green Hills Debug Probe安装目录。如果您安装了IDE、编译器和绿山调试探测器软件,安装程序会将安装链接在一起。如果您只使用Advanced Install选项安装IDE,那么当您第一次启动它时,IDE会提示您链接到编译器和绿山调试探针安装*。如果您使用Advanced Install选项只安装编译器和绿山调试探针软件,安装程序会提示您将IDE的安装链接到新的编译器和绿山调试探针安装。

舊梦的博客 1219

几种常用的排序算法(冒泡,插入排序,希尔排序,快速排序)

#include #include using namespace std; /*     冒泡排序     冒泡排序总的比较次数为:(n-1)+(n-2)...+1=n*(n-1)/2     时间复杂度:O(n^2)(数量级) */ void bubble_sort(int arr[], int n) {     int temp;     for(int i=0

Gouhailiang的博客 1924

YOLOv8中的可变形卷积改进 | 从DCNv1到DCNv3的多位置替换可变形卷积保姆级实操

可变形卷积(Deformable Convolution)最早由Dai等人在2017年提出,其核心思想是在标准卷积操作的基础上,引入可学习的偏移量(offsets),使卷积核能够自适应调整其采样位置,从而增强模型对目标变形的感知能力。return x本文通过深入探讨可变形卷积在YOLOv8中的应用,详细介绍了DCNv1、DCNv2和DCNv3的原理和实现,并通过实验验证了其在目标检测任务中的有效性。未来,我们将继续探索更多优化策略和技术,提升YOLOv8模型的性能,以应对更复杂的目标检测任务。

一键难忘的博客 4051

排序算法之冒泡、插入和希尔排序

简单排序算法冒泡排序冒泡排序算法是一种很简单的排序算法,它重复的访问要排序的数列,比较两个相邻的元素,如果这个两个元素不是出于正确的位置及左边的元素比右边大,则交换这两个元素的位置(从小到大排序)。一直重复这个过程直到所有的元素都是有序的。 例如:对{5 1 4 2 8}进行从小到大进行排序。 第一遍 ( 5 1 4 2 8 ) →\to ( 1 5 4 2 8 ), 首先, 冒泡算

david_liang 732

经典的YOLOv3和YOLOV5算法详解及代码复现

yolov3和yolov5算法详解及代码复现

hasakie的博客 771

059、肤色还原专项调优:记忆色、颜色偏好建模与主观评价标准

文章摘要:肤色还原调优的技术挑战与实践经验 本文系统探讨了手机影像中肤色还原的技术难点与解决方案。通过实际案例揭示了肤色还原的本质是记忆色与颜色偏好的博弈,而非单纯的技术指标达标。文章详细分析了记忆色的三大特性(高饱和、地域差异、场景依赖)和颜色偏好的数学建模方法,提出了基于YCbCr/Lab空间的参数化模型和代价函数设计。在评价体系方面,强调主观评价的重要性,并分享了专家评审、用户调研、场景覆盖的三级验证方法。最后总结了实战中的关键经验,包括肤色检测优化、过渡处理、动态范围管理及视频/拍照差异策略。文章指

sundong_81的博客 250

C++的数据结构与算法学习(二)简单排序算法

1. 选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 1.1 算法描述 n个记录的直接选择排序可经过n-1趟直接选择排序得到...

蒋成的博客 746

【007】C++编程必知:原码、补码、反码的全面解读

计算机存储的是数据的补码。原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。无符号数:原码=反码=补码。有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。原码、补码和反码都是用于计算机表示有符号整数的方法。

Lion_Long的博客 2921

刷题笔记:排序算法汇总(1)(冒泡、快排、插入排序、希尔排序)

排序算法是算法题中非常常见的一类题,相关的排序方法也很多,如:快速排序、冒泡排序、归并排序、简单选择排序、堆排序等等。本文以Leetcode 面试题 17.14. 最小K个数为例,对以上排序算法做一个回顾。 冒泡排序 冒泡排序是一种交换排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 算法步骤: 比较相邻的元素。如果第一个

qq_35531985的博客 219

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于排序算法的学习与总结1---冒泡、选择、插入、希尔排序

排序算法(SortAlgorithm)也称排序,排序是将一组数据,依指定的顺序进行排列的过程1)内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序:2)外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。最坏情况下的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是最坏情况下的时间复杂度。

MMMMMyyyyffff的博客 793

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

排序算法1(冒泡排序、选择排序、插入排序、希尔排序)

排序算法1 目录排序算法1冒泡排序主要思想代码优化代码选择排序主要思想代码插入排序主要思想代码希尔排序主要思想代码使用希尔排序对冒泡进行优化代码 冒泡排序 主要思想 对排序序列从前向后,依次比较相邻元素的值,如果逆序则交换。 代码 static void BubbleSort(int[] arr) { for (int i = 0; i < arr.Length - 1; i++) { for (int j = 0; j < arr.Length - i - 1;

RoySummy的博客 288

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

常见排序算法(1):冒泡排序、选择排序、插入排序、希尔排序、快速排序

它的主要思想是将待排序的数组分成若干个子序列进行插入排序,然后再对整个序列进行插入排序。实现过程中,需要预先设定一个。

m0_73589720的博客 800

排序算法系列1--简单排序(选择,冒泡,直接插入,希尔排序)

排序是数据处理中十分常见的操作,现代高级语言都有现成的n种排序算法。但了解它们的代码,对计算机思维有帮助。 简单选择排序 每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。 无论数组原始排列如何,比较次数都不变;变的是交换次数。完全有序的情况下无需交换移动元素,最差情况下(把数组倒序改成正序),交换次数最多: n...

weixin_30332241的博客 965

排序算法学习(1)(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

文章目录直接插入排序代码实现复杂度的计算希尔排序希尔排序的预排序代码实现选择排序代码实现堆排序冒泡排序代码实现 ???? 注:以下排序都是以排升序为例。 直接插入排序 直接插入排序的主要思路就是: 1.首先默认第一个元素是有序的。 2.然后将其下一个元素作为待排序的元素,插入到前面有序序列的相应位置。至于插入的过程,如果遇到比待排序大的元素,则这个元素后移,直到遇到比其小的元素,然后将待插入元素放入其前一个位置。 代码实现 void Insertsort(int *a, int sz) { i

IamGreeHand的博客 1451

排序算法(1)-冒泡排序,选择排序,插入排序,希尔排序,快速排序

一些基本的排序算法: package tenSortingMethods; /** * @author zhangdi * @description 排序算法 * @Date 20180531 */ public class Sort { public static void main(String[] args) { int[] arr = {6,1,2,...

Ryze 866

《数据结构》(9) - 排序算法(1)- 插入排序,希尔排序,选择排序,冒泡排序

文章目录排序概念及分类排序算法分类排序稳定性直接插入排序一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 排序概念及分类 排序算法分类 排序稳定性 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 提示:以下排序算法均以实现升序排列为例 直接插入排序 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了

weixin_52142420的博客 396

十大排序算法【1】---冒泡排序、快速排序、选择排序、插入排序、希尔排序

简单用C语言写了5种常见排序算法

weixin_45690131的博客 253

JAVA数据结构 08.排序算法(1) 排序算法的介绍和分类 算法的时间复杂度 冒泡排序 选择排序 插入排序 希尔排序

JAVA数据结构 08.排序算法(1) 1.排序算法的介绍和分类 排序:将一组数据,以指定的顺序进行排列的过程 排序的分类: 内部排序:将需要的所有数据加载到内存中进行排序**(8大排序算法)** 插入排序 直接插入排序 希尔排序 选择排序 简单选择排序 堆排序 交换排序 冒泡排序 快速排序 归并排序 基数排序 外部排序:数据量过大,无法全部加载到内存中,需要借助外存进行排序,先部分排序后合并 度量一个排序算法: 算法的时间复杂度 算法的空间复杂度 2. 八大排序算

NeverGiveUp 215

希尔排序&冒泡排序

1、希尔排序 将数组中每间隔为d的元素划分为同一组,然后对每一组使用插入排序。d有多个值,但要求最后一个值为1,即最后一次要进行插入排序。例如数组:2 9 1 3 6 3,如果d为2,那么2、1、6为一组;9、3、3为一组;1、6为一组,3、3位一组,对每组都进行插入排序。 //t为要排序的数组,l为存储d的数组,最后一个d必须为1 public void shellSort(List<In...

qq_40804920的博客 1204

排序算法-直接插入排序、希尔排序、直接选择排序、冒泡排序

稳定性的定义,排序算法的分类,直接插入排序,希尔排序,直接选择排序,冒泡排序

qq_43243800的博客 296

【数据结构】排序:插入排序与希尔排序详解

本章开始就要分享一些常用的排序方法,我们的日常生活中很多地方都要使用排序,比如电商平台可以按照你的需求进行排序,或者是你想了解大学的综合排名时我们之前也学到过一些简单的排序比如冒泡排序,虽然他在时间复杂度上可以说是依托答辩,但是作为排序算法来讲还是非常有教学意义的,让更多的人可以了解到排序。那首先分享两种排序算法,简单了解一下排序;

wangduduniubi的博客 1216
上一篇: 二进制中1的个数(进制转换,补码反码)
下一篇: 最小的k个数
念殊15
博客等级 码龄8年 17粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值