六、排序算法介绍3

news2024/11/21 1:37:10

4、希尔排序

4.1 简单插入排序问题

简单的插入排序可能存在的问题,数组 arr = { 2, 3, 4, 5, 6, 1 } 这时需要插入的数 1(最小),简单插入排序的过程如下:
{2,3,4,5,6,6}
{2,3,4,5,5,6}
{2,3,4,4,5,6}
{2,3,3,4,5,6}
{2,2,3,4,5,6}
{1,2,3,4,5,6}
结论: 当需要插入的数是较小的数时, 后移的次数明显增多, 对效率有影响

4.2 希尔排序基本介绍

希尔排序是希尔(Donald Shell) 于 1959 年提出的一种排序算法。 希尔排序也是一种插入排序, 它是简单插入排序经过改进之后的一个更高效的版本, 也称为缩小增量排序。

4.3 希尔排序基本思想

希尔排序按照增量将数组进行分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止

4.4 希尔排序图解(交换法)

在这里插入图片描述

4.5 理解希尔排序代码实现(交换法)

···
public class ShellSort {

public static void main(String[] args) {
	int[] arr = { 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 };
	shellSort(arr);
	
}

private static void shellSort(int[] arr) {
	int temp = 0;
	// 希尔排序的第1轮排序
	// 第1轮排序,是将10个数据分成了 5组
	for (int i = 5; i < arr.length; i++) {
		for (int j = i - 5; j >= 0; j-= 5) {
			if (arr[j] > arr[j + 5]) {
				temp = arr[j];
				arr[j] = arr[j+ 5];
				arr[j+ 5] = temp;
			}
		}
	}
	System.out.println("希尔排序1轮后=" + Arrays.toString(arr));
	
	// 希尔排序的第2轮排序
	// 第2轮排序,是将10个数据分成了 5/2 = 2组
	for (int i = 2; i < arr.length; i++) {
		for (int j = i - 2; j >= 0; j-= 2) {
			if (arr[j] > arr[j + 2]) {
				temp = arr[j];
				arr[j] = arr[j+ 2];
				arr[j+ 2] = temp;
			}
		}
	}
	System.out.println("希尔排序2轮后=" + Arrays.toString(arr));
	
	// 希尔排序的第3轮排序
	// 第3轮排序,是将10个数据分成了 2/2 = 1组
	for (int i = 1; i < arr.length; i++) {
		for (int j = i - 1; j >= 0; j-= 1) {
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j+ 1];
				arr[j+ 1] = temp;
			}
		}
	}
	System.out.println("希尔排序3轮后=" + Arrays.toString(arr));
	
}

}
···

4.6 希尔排序最终实现(交换法)

public class ShellSort {
	
	public static void main(String[] args) {
		int[] arr = { 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 };
		shellSort(arr);
	}

	private static void shellSort(int[] arr) {
		int temp = 0;
		int count = 0;
		for (int gap = arr.length /2; gap > 0; gap /= 2) {
			// 遍历各组中所有的元素(共gap组,每组有?个元素), 步长gap
			for (int i = gap; i < arr.length; i++) {
				for (int j = i - gap; j >= 0; j-= gap) {
					if (arr[j] > arr[j + gap]) {
						temp = arr[j];
						arr[j] = arr[j+ gap];
						arr[j+ gap] = temp;
					}
				}
			}
			System.out.println("希尔排序第"+(++count)+"轮后=" + Arrays.toString(arr));
		}
	}
}

4.7 测试希尔排序(交换法)性能

public class ShellSort {
	
	public static void main(String[] args) {
		// 创建要给80000个的随机的数组
		int[] arr = new int[80000];
		for (int i = 0; i < 80000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}

		Date date1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(date1);
		System.out.println("排序前的时间是=" + date1Str);

		shellSort(arr); // 交换式

		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("排序前的时间是=" + date2Str);
		
	}

	private static void shellSort(int[] arr) {
		int temp = 0;
		int count = 0;
		for (int gap = arr.length /2; gap > 0; gap /= 2) {
			// 遍历各组中所有的元素(共gap组,每组有?个元素), 步长gap
			for (int i = gap; i < arr.length; i++) {
				for (int j = i - gap; j >= 0; j-= gap) {
					if (arr[j] > arr[j + gap]) {
						temp = arr[j];
						arr[j] = arr[j+ gap];
						arr[j+ gap] = temp;
					}
				}
			}
			System.out.println("希尔排序第"+(++count)+"轮后=" + Arrays.toString(arr));
		}
		
	}

}

程序运行结果

排序前的时间是=2022-12-09 14:19:41
排序前的时间是=2022-12-09 14:19:47

缺点:基于交换法的希尔排序算法比简单选择排序算法速度更慢

4.8 编写希尔排序(插入法)

public class ShellSort {
	
	public static void main(String[] args) {
		int[] arr = { 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 };
		shellSort(arr);
	}
	
	public static void shellSort(int[] arr) {
		// 增量gap, 并逐步的缩小增量
		for (int gap = arr.length /2; gap >0; gap/=2) {
			// 从第gap个元素,逐个对其所在的组进行直接插入排序
			for (int i = gap; i < arr.length; i++) {
				int j = i; 
				int temp = arr[j];
				while (j - gap >= 0 && temp < arr[j - gap]) {
					arr[j] = arr[j - gap];
					j-= gap;
				}
				arr[j] = temp;
			}
		}
		System.out.println("希尔排序后=" + Arrays.toString(arr));
	}
}

4.9 测试希尔排序(插入法)性能

public class ShellSort {
	public static void main(String[] args) {
		// 创建要给80000个的随机的数组
		int[] arr = new int[80000];
		for (int i = 0; i < 80000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}

		Date date1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(date1);
		System.out.println("排序前的时间是=" + date1Str);

		shellSort(arr); 

		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("排序前的时间是=" + date2Str);
	}
	
	public static void shellSort(int[] arr) {
		// 增量gap, 并逐步的缩小增量
		for (int gap = arr.length /2; gap >0; gap/=2) {
			// 从第gap个元素,逐个对其所在的组进行直接插入排序
			for (int i = gap; i < arr.length; i++) {
				int j = i; 
				int temp = arr[j];
				while (j - gap >= 0 && temp < arr[j - gap]) {
					arr[j] = arr[j - gap];
					j-= gap;
				}
				arr[j] = temp;
			}
		}
	}
}

代码运行结果

排序前的时间是=2022-12-09 16:27:36
排序前的时间是=2022-12-09 16:27:36

5 快速排序

5.1 基本介绍

快速排序(Quicksort)是对冒泡排序的一种改进,借用了分治的思想,由东尼·霍尔在1962年提出。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

5.2 快速排序图解

在这里插入图片描述
分步解释说明:

  • 每次以最后一个元素array[high]为中心元素pivot
  • pointer用于指向比中心元素大的元素的下标,从low开始

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

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

相关文章

CCIA技术沙龙 | “数据安全风险评估及安全服务实践” 沙龙成功举办

2022年12月8日&#xff0c;由中国网络安全产业联盟&#xff08;CCIA&#xff09;主办、CCIA数据安全工作委员会支持、杭州美创科技股份有限公司承办的“数据安全风险评估及数据安全服务实践”主题技术沙龙成功举办。 当前&#xff0c;我国数字经济快速发展、数字化转型持续深入…

Java对象深拷贝详解(List深拷贝)

1、Java中拷贝的概念 在Java语言中&#xff0c;拷贝一个对象时&#xff0c;有浅拷贝与深拷贝两种 浅拷贝&#xff1a;只拷贝源对象的地址&#xff0c;所以新对象与老对象共用一个地址&#xff0c;当该地址变化时&#xff0c;两个对象也会随之改变。 深拷贝&#xff1a;拷贝对…

一起学习用Verilog在FPGA上实现CNN----(一)总体概述

1 总体概述 为避免闭门造车&#xff0c;找一个不错的开源项目&#xff0c;学习在FPGA上实现CNN&#xff0c;为后续的开发奠定基础 1.1 项目链接 大佬的开源项目链接&#xff1a; CNN-FPGA 链接跳转界面如下&#xff1a; 大佬的该项目已经发表论文&#xff0c;而且开源工程结…

Qt5.6.1移植海思Hi3521d(一)

系列文章目录 文章目录系列文章目录前言一、开发环境二、搭建环境1.准备2.海思SDK和交叉编译器安装2.测试交叉编译器一下3.安装tftp总结前言 上半年做个一个Qt移植海思芯片的程序&#xff0c;感觉差不多快忘记了&#xff0c;赶紧记录一下 一、开发环境 系统&#xff1a;Ubunt…

初学Python到月入过万最快的兼职途径(纯干货)

程序员小猴紫&#xff0c;不错过任何一次干赚钱干货 1.兼职薪资&#xff0c;附行哥工资单2.兼职门槛&#xff0c;附学习知识清单3.兼职途径&#xff0c;附入职考核过程4.我的兼职感受 答应小猴紫的第一篇赚钱干货推文来啦&#xff0c;行哥第一个在读书期间通过兼职赚到的10w收…

Web前端大作业—里约热内卢奥运会(html+css+javascript)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

产品经理 - 产品设计方法论需求分析部分

整体 – 产品设计方法论思维导图 个人整理&#xff0c;存在异议大家可以讨论下 需求分析方法论 需求分析为需求收集的延展&#xff0c;需求收集后即需进行需求分析&#xff0c;拆解需求后方可业务落地&#xff0c;此处我将其分为两步&#xff0c;一是主动发散型需求分析&am…

移动端项目(第十九课)Vite+Vant组件环境配置

常用到的环境配置时不我待(第十八课)项目环境搭建_星辰镜的博客-CSDN博客 在上面的环境的基础上加上下面的一下配置 Normalize.css: Make browsers render all elements more consistently. (necolas.github.io) 介绍 | Pinia 中文文档 (web3doc.top) Day.js 中文文档 - 2kB 大…

【Java版oj】day02排列子序列

目录 一、原题再现 二、问题分析 三、完整代码 一、原题再现 链接&#xff1a;排序子序列_牛客笔试题_牛客网 来源&#xff1a;牛客网 [编程题]排序子序列 热度指数&#xff1a;10105 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32M&…

水果店引流活动推荐_分享水果店微信小程序制作步骤

试试做个小程序拯救你的店&#xff01;让你做出有效果的活动&#xff0c;每笔钱都花在刀刃上&#xff01; 第一&#xff0c;提升水果销量&#xff0c;降低损耗 用水果店小程序做拼团、砍价、秒杀活动&#xff0c;并讲原本卖不完的水果&#xff0c;做成果盘吸引客人注册会员。上…

Manufactoria介绍及各关卡解法

Manufactoria解法Manufactoria基本介绍解法RobotoastRoboManufactoria基本介绍 Manufactoria是一个以制造工厂为背景的程序设计游戏。在游戏中&#xff0c;玩家需要在有限的平面空间中巧妙地排布传送带&#xff0c;打点器与分支器&#xff0c;完成识别或改写特定模式的字符串的…

6.AOP之转账案例

数据准备 CREATE TABLE account (id int(11) NOT NULL,name varchar(100) NOT NULL,money decimal(7,2) NOT NULL,create_time datetime(6) NOT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;insert into account values(1,"steven",10000,"2022…

循环程序设计 乘法口诀表

凡是写循环程序 必须满足两个条件 一是存在相同的操作 二是有规律 对于乘法口诀表 我们都很熟悉 如下图是左下角的 探求一下 规律&#xff1a; 1 多个乘法 2 规律性 第一1行 1个乘法运算 1*1 第二2行 2个乘法运算 1*2 2*2 第三3行 3个乘法运算 1*3 2*3 3*3 第四4行 4个…

关于Linux的基础总结

关于Linux的基础总结 文章目录关于Linux的基础总结前言一、为什么Linux如此流行&#xff1f;1.原因2.Linux系统的版本二、Linux的基础命令1.目录结构2.文件命令1.ls2.pwd3.cd4.touch、mkdir5.cat、tail、head、tail、od、tee、more、less6.rm、cp、mv7.find、grep、xargs8.tar、…

voc To yolov5-6.1数据集格式转换

voc To yolov5-6.1数据集格式转换 已有的数据集操作第一步:划分训练集、验证集、测试集通过脚本文件(createImageSet.py)生成训练集和验证集本代码需要修改的地方:结果:第二步:vocToyolo1、Head_classes.json文件:Head_classes.json文件对应的代码:3、操作技巧:2、第二…

用Python画一个足球

文章目录前情提要先画六边形再画五边形前情提要 如果想优雅地绘制一个足球&#xff0c;那首先需要绘制正二十面体&#xff1a;用Python绘制正二十面体 其核心代码为 import numpy as np from itertools import product G (np.sqrt(5)-1)/2 def getVertex():pt2 [(a,b) fo…

【Flask框架】——07 request请求和 get请求 post请求

request参数 指定请求方式 在Flask中&#xff0c;可以定义路由默认的请求方式&#xff1a; 利用 methods 参数可以自己指定一个接口的请求方式 get方式&#xff1a;把请求参数放到为url的&#xff1f;后面&#xff0c;每个请求参数格式为&#xff1a;参数名参数值。参数之间…

全梯度下降算法、随机梯度下降算法、小批量梯度下降算法、随机平均梯度下降算法、梯度下降算法总结

一、常见梯度下降算法 全梯度下降算法(Full gradient descent&#xff0c;FGD&#xff09;随机梯度下降算法&#xff08;Stochastic gradient descent&#xff0c;SGD&#xff09;随机平均梯度下降算法&#xff08;Stochastic average gradient descent&#xff0c;SAGD&#…

12.9工作学习记录 课程统计 Echarts表格插件 Stream.map

课程统计接口要做的是 统计各个日期的用户观看人数 生成报表 sql就是根据日期分组 查出开始时间到结束时间这个区间范围内 每天有多少人观看 SELECT DATE(join_time) AS joinTime, COUNT(*) AS userCount FROM video_visitor <…

基于ServiceStage的微服务开发与部署(二)

目录 2.微服务开发与部署 2.1. 组织管理 2.2. 仓库授权 2.3. 微服务接入CSE 2.4. 基于源码构建软件包 2.5. 创建环境 2.6. 应用部署 2.7. 外网访问 2.微服务开发与部署 2.1. 组织管理 步骤 1 打开应用管理与运维平台控制台&#xff0c;在"软件中心"-"组织管理&q…