第一讲:基础算法

 

第二讲:数据结构

1.单链表

2.双链表

3.栈

4.队列

5.单调栈

6.单调队列

7.KMP

8.Trie

9.并查集

10.堆

838. 堆排序 

题目:

输入一个长度为 m 小的数。

输入格式

第一行包含整数 m。

第二行包含 n 个整数,表示整数数列。

输出格式

共一行,包含 m 小的数。

数据范围


输入样例:

5 3
4 5 1 3 2

输出样例:

1 2 3

分析:

 1 # 堆
 2 
 3 堆是一个完全二叉树。
 4 
 5 性质:每个节点都满足小于等于它的左右两边的节点。
 6 
 7 存储:1号节点为根节点,x的左儿子:`2x`,x的右儿子:`2x+1`
 8 
 9 
10 
11 操作
12 
13 把节点往下移
14 
15 将根节点大于左儿子和右儿子中的最小值,将根节点与左右儿子中最小的那个交换位置。然后一直交换到不能交换为止。
16 
17 ```cpp
18 void down(){
19     
20 }
21 ```
22 
23 把节点往上移
24 
25 某个数变小后,每次与父节点进行比较就好了,如果比父节点小的话,就要和父节点进行交换
26 
27 ```cpp
28 void up(){
29     
30 }
31 ```
32 
33 如何手写一个堆:
34 
35 1.插入一个数
36 
37 2.求集合当中的最小值
38 
39 3.删除最小值
40 
41 4.删除任意一个元素
42 
43 5.修改任意一个元素
44 
45 
46 
47 1.插入一个数:
48 
49 在当前堆的最后面插入进去,然后进行up操作
50 
51 ```cpp
52 heap[++ size] = x;
53 
54 up(size);
55 ```
56 
57 2.求集合当中的最小值
58 
59 ```cpp
60 heap[1]; 
61 ```
62 
63 3.删除最小值
64 
65 用堆中的最后一个元素覆盖掉第一个元素,size--然后down一下
66 
67 一维数组删掉第一个元素比较难,但是删掉最后一个元素很简单
68 
69 ```cpp
70 heap[1] = heap[size -- ];
71 down(1);
72 ```
73 
74 4.删除任意一个元素
75 
76 ```cpp
77 heap[k] = heap[size]; 
78 size -- ;
79 down(k), up(k);
80 ```
81 
82 5.修改任意一个元素
83 
84 ```cpp
85 heap[k] = x; 
86 down(k), up(k);
87 ```
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-27
  • 2021-12-03
  • 2021-11-16
  • 2021-06-11
  • 2022-12-23
  • 2022-02-08
猜你喜欢
  • 2022-12-23
  • 2022-02-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-06
相关资源
相似解决方案