首页
3D照片墙
统计
留言
Search
1
1.OAuth 的简单理解
115 阅读
2
多个拦截器的执行顺序
105 阅读
3
基于Annotation方式的声明式事务
102 阅读
4
6.设计模式汇总
101 阅读
5
Unity 依赖注入
98 阅读
Java
JDBC
Spring
Spring MVC
SpringBoot
SpringCloud
MybatisPlus
Mybatis
Maven
SpringSecurity
JVM
java注解与反射
Java JUC并发编程
SSM
.NET
IdentityServer4
EF
.Net Core
AbpVNext + DDD
.NET MVC Api
前端
Jquery&JavaScript
uniapp
VUE
Echars
Vue底层原理
Python
Django
软考笔记
软件设计师
1.计算机组成与体系结构
10.面向对象技术
11.UML类图建模
12.面向对象程序设计
13.数据结构
14.算法基础
16.知识产权标准化
17.程序设计语言
2.操作系统
3.数据库
4.数据库设计
5.计算机网络
6.信息安全
7.系统开发基础
8.项目管理
9.数据流图
架构设计
CQRS架构
DDD架构
数据库技术
SQL锁
SqlServer
Oracle 主从备份
Oracle RAC集群
Mysql
云原生/容器技术
kubernetes
Docker
数据结构与算法
常用中间件
Redis
RabbitMQ 消息队列
ElasticSearch
其他
PHP
OAuth 2.0
WebSocket
ArkTs Harmony 开发
运维
Search
标签搜索
排序算法
vue
算法
遍历
docker
线性
数组
dom
synchronized
数据库
xml语言
log4j
bigint
静态函数
静态方法
哈夫曼树
const
冒泡排序
商标设计
命令模式
Bi8bo
累计撰写
304
篇文章
累计收到
6
条评论
首页
栏目
Java
JDBC
Spring
Spring MVC
SpringBoot
SpringCloud
MybatisPlus
Mybatis
Maven
SpringSecurity
JVM
java注解与反射
Java JUC并发编程
SSM
.NET
IdentityServer4
EF
.Net Core
AbpVNext + DDD
.NET MVC Api
前端
Jquery&JavaScript
uniapp
VUE
Echars
Vue底层原理
Python
Django
软考笔记
软件设计师
1.计算机组成与体系结构
10.面向对象技术
11.UML类图建模
12.面向对象程序设计
13.数据结构
14.算法基础
16.知识产权标准化
17.程序设计语言
2.操作系统
3.数据库
4.数据库设计
5.计算机网络
6.信息安全
7.系统开发基础
8.项目管理
9.数据流图
架构设计
CQRS架构
DDD架构
数据库技术
SQL锁
SqlServer
Oracle 主从备份
Oracle RAC集群
Mysql
云原生/容器技术
kubernetes
Docker
数据结构与算法
常用中间件
Redis
RabbitMQ 消息队列
ElasticSearch
其他
PHP
OAuth 2.0
WebSocket
ArkTs Harmony 开发
运维
页面
3D照片墙
统计
留言
搜索到
10
篇与
的结果
2023-06-28
排序算法 - 2.希尔排序(Shell's Sort)
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。 **希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。** (注:为方便记忆算法,我习惯将其记作“三层for循环+if” ------ for(for(for(if)))) 2.步骤 希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。 public static void main(String[] args) { int[] arr = {99, 5, 69, 33, 56, 13, 22, 55, 77, 48, 12, 88, 2,69,99}; System.out.println("排序之前数组:"); printArray(arr); //希尔排序 insertionSort(arr); System.out.println("希尔排序后数组:"); System.out.println(Arrays.toString(arr)); } private static int[] insertionSort(int[] arr){ if(arr == null || arr.length <= 1){ return arr; } //希尔排序 升序 // arr.length==15 for (int d = arr.length / 2;d>0;d /= 2){ //d:增量 7 3 1 System.out.println("增量取值:" + d); for (int i = d; i < arr.length; i++){ //i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标 //j:代表与i同一组的数组元素角标 for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界 // System.out.println("i:" + i + " j:" + j +" j+d="+(j+d)); if (arr[j] > arr[j + d]) {// j+d 代表即将插入的元素所在的角标 //符合条件,插入元素(交换位置) swap(arr,j,j+d); } } } /*测试:此段代码只为查看希尔排序的每次增量变化过程,正常写程序时不要添加星号注释的这部分代码*/ for (int m = 0; m < arr.length; m++) { System.out.print(arr[m] + " "); } System.out.println(""); /**/ } return arr; } /* 发现无论什么排序。都需要对满足条件的元素进行位置置换。 所以可以把这部分相同的代码提取出来,单独封装成一个函数。 */ public static void swap(int[] arr,int a,int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } /* * 最近才知道打印数组不用自己写方法这么麻烦,java API中就有 Arrays.toString(arr); * 越简单的越容易忽略,这是最后一次自己写这个方法,以后就用自带的方法 */ public static void printArray(int[] arr) { System.out.print("["); for(int x=0; x<arr.length; x++) { if(x!=arr.length-1){ System.out.print(arr[x]+", "); }else{ System.out.println(arr[x]+"]"); } } } 希尔排序的执行时间依赖于增量序列。 希尔排序耗时的操作有:比较 + 后移赋值。 时间复杂度情况如下:(n指待排序序列长度) 1) 最好情况:序列是正序排列,在这种情况下,需要进行的比较操作需(n-1)次。后移赋值操作为0次。即O(n) 2) 最坏情况:O(nlog2n)。 3) 渐进时间复杂度(平均时间复杂度):O(nlog2n)
2023年06月28日
83 阅读
0 评论
35 点赞
2023-06-27
排序算法 - 4.快慢指针算法。
快慢指针也称龟兔赛跑算法,又叫判圈算法。 具体方法是声明两个指针fast 指针和slow 指针,这两个指针按照题目的需求有不同的行进方案(例如fast每次行进2步,slow每次行进1步),但基本上步长是不同的,所以叫龟兔赛跑算法。 比较经典的题目如下,判断链表是否有环,所以又叫判圈算法。
2023年06月27日
16 阅读
0 评论
37 点赞
2022-07-16
排序算法 - 6.选择排序
选择排序的原理: 选择排序在开始的时候,先扫描整个列表,以找到列表中的最小元素,然后将这个元素与第一个元素进行交换。这样最小元素就放到它的最终位置上。然后,从第二个元素开始扫描,找到n-1个元素中的最小元素,然后再与第二个元素进行交换。以此类推,直到第n-1个元素(如果前n-1个元素都已在最终位置,则最后一个元素也将在最终位置上)。 选择排序的基本思想是: 每一趟在n − i + 1 ( i = 1 , 2 , . . . , n − 1 ) 个元素中选择最小的元素,并将其作为有序序列中第 i 个元素。 public static void selectionSort(int[] array) { int len = array.length; int minIndex; //最后一个元素最后已经是排完的状态了,无需再排 for (int i = 0; i < len - 1; i++) { //默认认为当前序列的第一个元素是当前序列中的最小/大元素 minIndex = i; //找到更小的元素 for (int j = i + 1; j < len; j++) { if (array[j] < array[minIndex]) { minIndex = j; } } //交换最小/大元素和第一个元素的位置 if (minIndex != i) { int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } } } 算法分析 表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。
2022年07月16日
54 阅读
0 评论
87 点赞
2022-05-20
排序算法 - 5.插入排序
插入排序的原理: 一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。 选择排序的基本思想是: 将未排序的元素一个一个地插入到有序的集合中,插入时把所有有序集合从后向前扫一遍,找到合适的位置插入。 public static void main(String[] args) { int[] arr = {1456, 22, 2378, 7867, 14, 87, 57, 9, 3}; //默认认为第一个元素是排序好的,所以从第二个元素开始 for (int i = 1; i < arr.length; i++) { //从当前 i 的这个元素的前一个位置开始,往最前面找 for (int j = i; j > 0; j--) { //如果找到比一个小的数,就交换一下 if (arr[j]<arr[j - 1]) { swap(arr, j, j - 1); } //发现前面的数比 i 大, 说明前面已经没有比它更小的了 无需再找,退出本次循环 else { break; } } } for (int i : arr) { System.out.println(i); } } private static void swap(int[] arr, int indexA, int indexB) { int temp = arr[indexA]; arr[indexA] = arr[indexB]; arr[indexB] = temp; } 平均时间复杂度:O(N^2) 最差时间复杂度:O(N^2) 空间复杂度:O(1) 排序方式:In-place 稳定性:稳定
2022年05月20日
81 阅读
0 评论
80 点赞
2021-12-03
2.队列 Queue
队列是一个有序列表,可以用数组或是 来实现。 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出 示意图:(使用数组模拟队列示意图) rear 队尾 , front 队首 当我们将数据存入队列时称为”addQueue”, addQueue的处理需要有两个步骤: 思路分析 1)将尾指针往后移: rear+1,当front== rear【空】 2)若尾指针rear小于队列的最大下标 maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。 rear==maxSize- 1[队列满] 问题分析 1)目前数组使用一次就不能用了,没有达到复用的效果 2)将这个数组使用算法改进成一个环形队列
2021年12月03日
48 阅读
0 评论
64 点赞
1
2