第二章 基础算法

简介: 第二章 基础算法

2.18【问】堆排序的实现思路
参考下图
首先建立一个大顶堆,堆顶元素就是最大元素,把它交换到数组尾部,最大元素就排好序了
交换到堆顶的元素破坏了堆特性,对它下潜,下潜完成后堆顶就成了第二大元素,再把它交换到数组尾部,二大元素也排好了
这样依此类推,下潜=>堆顶元素交换=>下潜=>堆顶元素交换 ... 直至剩余一个元素,算法结束
P.S.
参考代码
2.19【追问】堆排序与其它排序算法比较
堆排序同级别排序方法有快排、归并等,它们的时间复杂度都是 O(n * log{n})
堆排序中的下潜操作涉及到父元素与它的左右孩子交换,数据量较大时,父元素距离它的孩子较远,这样可能会造成(CPU)缓存未命中,增加内存访问成本。快排和归并则没有这个问题
P.S.
个人认为,堆相对于堆排序更为重要,它可以应用于优先级队列、TopK 问题 ...
3、字符串类
3.1、字符串反转
源于 Leetcode 344 题
举一反三 Leetcode 151 题(反转单词)
思路 - 双指针
一开始,i 指针指向数组起始元素,j 指针指向数组结束元素,交换 i、j 指向的元素。
i 向后移动,j 向前移动,重复以上过程 ,直至 i、j 相遇,算法结束。
参考代码
Plain Text
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static void sort(int[] a) {
heapify(a, a.length);
for (int right = a.length - 1; right > 0; right--) {
swap(a, 0, right);
down(a, 0, right);
}
}

// 建堆 O(n)
private static void heapify(int[] array, int size) {
for (int i = size / 2 - 1; i >= 0; i--) {
down(array, i, size);
}
}

// 下潜 O(log n)
private static void down(int[] array, int parent, int size) {
// 比较 parent 和它的左、右孩子
while (true) {
int left = parent * 2 + 1;
int right = left + 1;
// max 代表 parent 和它的左、右孩子中最大值
int max = parent;
if (left < size && array[left] > array[max]) {
max = left;
}
if (right < size && array[right] > array[max]) {
max = right;
}
// 最大的就是 parent 自己
if (max == parent) {
break;
}
// parent 与孩子中较大者交换
swap(array, max, parent);
// 继续下潜
parent = max;
}
}
Plain Text
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void reverseString(char[] s) {
reverseString(s, 0, s.length - 1);
}

static void reverseString(char[] s, int begin, int end) {
int i = begin;
int j = end;
while (i < j) {
swap(s, i, j);
i++;
j--;
}
}

static void swap(char[] array, int i, int j) {
char c = array[i];
array[i] = array[j];
array[j] = c;
}

相关文章
|
4月前
|
缓存 安全 Java
第五章 Spring框架
第五章 Spring框架
|
4月前
|
Java 测试技术 Linux
生产环境发布管理
在一个大型团队中,生产发布涉及多环境推进(DEV→TEST→PRE→PROD),以及热更新、回滚等问题。本文基于公司自动化部署平台,讲解如何实现多环境部署与发布管理,涵盖各环境职责、分支管理、自动化构建、日志排查等内容,帮助理解大型企业如何通过CI/CD提升发布效率与稳定性。
112 0
|
4月前
|
消息中间件 存储 Java
第15课: Spring Boot中集成ActiveMQ
第15课: Spring Boot中集成ActiveMQ
385 0
|
4月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
652 0
|
9月前
|
存储 缓存 安全
Java HashMap详解及实现原理
Java HashMap是Java集合框架中常用的Map接口实现,基于哈希表结构,允许null键和值,提供高效的存取操作。它通过哈希函数将键映射到数组索引,并使用链表或红黑树解决哈希冲突。HashMap非线程安全,多线程环境下需注意并发问题,常用解决方案包括ConcurrentHashMap和Collections.synchronizedMap()。此外,合理设置初始化容量和加载因子、重写hashCode()和equals()方法有助于提高性能和避免哈希冲突。
473 17
Java HashMap详解及实现原理
|
4月前
|
人工智能 大数据 开发者
让AI时代的卓越架构触手可及,阿里云技术解决方案开放免费试用
阿里云推出基于场景的解决方案免费试用活动,新老用户均可领取100点试用点,完成部署还可再领最高100点,相当于一年可获得最高200元云资源。覆盖AI、大数据、互联网应用开发等多个领域,支持热门场景如DeepSeek部署、模型微调等,助力企业和开发者快速验证方案并上云。
5356 187
让AI时代的卓越架构触手可及,阿里云技术解决方案开放免费试用
|
4月前
|
Java 数据格式 微服务
SpringBoot使用汇总
SpringBoot使用汇总
104 0
SpringBoot使用汇总
|
4月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
470 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
4月前
|
开发框架 前端开发 Java
Spring篇
Spring是一个用于简化Java企业级应用开发的开源框架,核心功能包括控制反转(IoC)和面向切面编程(AOP)。它通过管理对象生命周期、解耦组件、支持多种注入方式及提供如MVC、事务管理等模块,提升开发效率与代码质量。常用于构建轻量、灵活、易维护的企业级应用程序。
263 0
|
4月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
207 0
下一篇
开通oss服务