最近总感觉不在状态,感觉应该喝一瓶脉动才行(脉动回来!)

不过没事,总会好的,Gonna be OK!

今日计划

先把昨天专业课没解决的和没太搞明白的东西看一看,然后按昨天的节奏继续以复习专业课和数学为重点。

  1. 复习专业课没懂的
  2. 做专业课题
  3. 政治一章
  4. 数学选填
  5. 政治一章
  6. 英语阅读*2

 

今日总结

专业课的练度不是很够,花了很多的时间,政治题得抓紧多做一点,至少20号之前1000题得糊弄完。

睡前带着看两眼英语就ok。

摆烂人每天都完不成自己的学习计划.md

 

解决昨日问题

  1. 操作系统信号量
  2. 银行家算法
  3. 段页式
  4. 堆排序

堆排序最难理解的部分就是调整堆是怎么在数组中进行的。

写了个堆排序以及详细的注释:

* 其实这个代码调整堆的代码是以数组下标从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.