Skip to content

Commit 4f921d8

Browse files
committedMay 24, 2024·
modify sort
1 parent 2bfe791 commit 4f921d8

File tree

1 file changed

+12
-39
lines changed

1 file changed

+12
-39
lines changed
 

‎_tutorials/2024-04-27-sort.md

+12-39
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1+
[toc]
2+
13
---
24
layout: post
35
title: Refresh - 排序
46
date: 2024-04-27 14:29:00 +0800
57
---
68

7-
排序算法很重要,一是因为它是最基础的算法,二是不同的排序方法展示了不同的经典思路,学会这些思路对其他问题的思考能带来非常大的帮助。
8-
9-
参考:
10-
- [十大经典排序算法](https://www.runoob.com/w3cnote/ten-sorting-algorithm.html)
9+
排序算法很重要,一是因为它是最基础的算法,二是不同的排序方法展示了不同的经典思路,学会这些思路对其他问题的思考能带来非常大的帮助。参考[十大经典排序算法](https://www.runoob.com/w3cnote/ten-sorting-algorithm.html)
1110

1211
1. Table of Contents, ordered
1312
{:toc}
@@ -308,17 +307,19 @@ public void merge_sort_recursive(int[] arr, int[] result, int start, int end) {
308307
## 相关题型
309308
开头就说了,学习排序更重要的是学习算法的思想。归并的思想用来解决一些问题会更高效。
310309

311-
### [合并k个升序链表](https://leetcode.cn/problems/merge-k-sorted-lists/description/)
310+
### 合并k个升序链表
312311
[合并k个升序链表](https://leetcode.cn/problems/merge-k-sorted-lists/description/)
313312

314313
```java
315314
public ListNode mergeKLists(ListNode[] lists) {
316315
}
317316
```
318317

319-
也是先分再治。归并排序是两个字数组合并为一个数组,这里是两个链表合并成一个链表
318+
在了解分治思路之前,可能会用暴力(for)的方式。但是如果用for循环实现两两merge的话,其实之前merge过的元素还要在接下来的链表里再比一遍。如果使用归并,就会和归并排序一样,少比了不少元素
320319

321-
这里**用起止索引来划分数组**,很优雅:
320+
所以思路也是先分再治。归并排序是两个子数组合并为一个数组,这里是两个链表合并成一个链表。
321+
322+
**用起止索引来划分数组**,很优雅:
322323
```java
323324
/**
324325
* Definition for singly-linked list.
@@ -556,38 +557,10 @@ O(n^2)
556557

557558
### 构建堆 nlogn
558559

559-
```math
560-
通常堆是通过一维数组来实现的。只要画个二叉树并标记好位置序号(按照数组起始位置为0标记),就能发现:\\
561-
562-
父节点i的左子节点在位置
563-
(
564-
2
565-
i
566-
+
567-
1
568-
); \\
569-
570-
571-
父节点i的右子节点在位置
572-
(
573-
2
574-
i
575-
+
576-
2
577-
);
578-
{\displaystyle } \\
579-
580-
子节点k的父节点在位置
581-
582-
(
583-
k
584-
585-
1
586-
)
587-
/
588-
2
589-
⌋;
590-
```
560+
通常堆是通过一维数组来实现的。只要画个二叉树并标记好位置序号(按照数组起始位置为0标记),就能发现:
561+
- 父节点i的左子节点在位置`(2i+1)`
562+
- 父节点i的右子节点在位置`(2i+2)`
563+
- 子节点k的父节点在位置`⌊(k−1)/2⌋`;
591564

592565
之前我做了一种错误的构建方式是:~~只要**倒着**比较根、左子节点、右子节点三个节点的值即可,把最值挑出来,作为根,并重复这个过程,最后的root就是最值。即:直接for i in [len - 1, 0],对于每一个i,比较i、2i-1、2i+1三处节点的最值即可。所以只需要从第一个有子节点的节点开始进行上述比较即可:for i in [(len - 1) / 2(向下取整), 0]~~
593566

0 commit comments

Comments
 (0)
Please sign in to comment.