最近总感觉不在状态,感觉应该喝一瓶脉动才行(脉动回来!)
不过没事,总会好的,Gonna be OK!
今日计划
先把昨天专业课没解决的和没太搞明白的东西看一看,然后按昨天的节奏继续以复习专业课和数学为重点。
复习专业课没懂的做专业课题政治一章数学选填- 政治一章
- 英语阅读*2
今日总结
专业课的练度不是很够,花了很多的时间,政治题得抓紧多做一点,至少20号之前1000题得糊弄完。
睡前带着看两眼英语就ok。
摆烂人每天都完不成自己的学习计划.md
解决昨日问题
操作系统信号量银行家算法段页式堆排序
堆排序最难理解的部分就是调整堆是怎么在数组中进行的。
写了个堆排序以及详细的注释:
* 其实这个代码调整堆的代码是以数组下标从1开始做的,所以其实逻辑上有点对不上。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 最难理解的就是堆是怎么调整的
// 逆向人特长:看代码写注释并理解过程
void HeapAdjust(int* a, int s, int m) { // a[s+1]到a[m]已经排好了,就加入a[s]开始排
int rc = a[s]; // 临时保存a[s]
for (int j = 2*s; j <= m; j *= 2) { // 沿着值较大的孩子向下筛选
// j = 2*s 为左孩子a[j],右孩子a[j+1]
if (j < m && a[j]<a[j+1]) { // 判断左右孩子大小,并且不能超过m
j++;
}
if (rc >= a[j]) { // 如果顶部节点大于孩子节点,则ok
break;
}
a[s] = a[j]; // 将这个孩子挪上来
s = j; // 去排这个孩子的子树
}
a[s] = rc; // 将原顶部节点插进去
}
void CreateHeap(int* a, int length) {
// 创建堆
for (int i = length/2-1; i >= 0; i --) { // 从最后一个分支的节点开始向前调整
HeapAdjust(a, i, length);
}
}
void HeapSort(int* a, int length) {
int tmp;
// 创建堆
CreateHeap(a, length);
for(int i = length-1; i > 0; i --) {
// 将堆顶元素换到最后
tmp = a[i];
a[i] = a[0];
a[0] = tmp;
// 将剩下的调整成大根堆
HeapAdjust(a, 0, i-1);
}
}
#define LEN 20
int main() {
int i;
int a[LEN] = {0};
srand((unsigned int)time(0));
for (i = 0; i < LEN; i ++) {
a[i] = rand()%1000;
printf("%d ", a[i]);
}
printf("\n");
// 排序
HeapSort(a, LEN);
for (i = 0; i < LEN; i ++) {
printf("%d ", a[i]);
}
return 0;
}
0 Comments latest
No comments.