1.开始我真正意义上的第一次实习, 还是在北上广深的大城市。刚开始车站的一碗混沌让我记忆尤其深刻,这就是大城市的物价,啧啧啧。。。
2.刚开始一个人在工位上,只能看着其他人忙碌的身影,让我感到毫无游戏体验,就好像韩劳模看着大战后的其他修士捡尸一样,我下定决心要努力学习,学长说我要学的东西还很多,必须加油了。
3.第一天也没做什么,重写了一遍当时的笔试试卷,结果还是会写的能写,不会写还是不会写。
加个C语言实现的延迟函数吧。
#include <stdio.h>
#include <time.h>
void delay(const int seconds) {
// 记录当前时钟时间
clock_t start_time = clock();
//得到延迟结束的时钟时间
//CLOCKS_PER_SEC为定义的宏/macro, 其值为1000,可以将其秒/sec转化为clock()的返回值
clock_t end_time = seconds * CLOCKS_PER_SEC + start_time;
/*clock()函数在VS2022找不到定义,返回从关联到进程开始执行的实现定义时期的起,进程所用的粗略
处理器时间。将此值除以 CLOCKS_PER_SEC 可转换为秒。使用clock_t/long表示*/
while (clock() < end_time); // 空循环等待
// 调用延迟函数,延迟10秒
printf("延迟结束!\n");
}
int main() {
//打印测试结果
int seconds = 10;
printf("开始延迟%d...\n", seconds);
//延迟十秒,单位:秒/s
delay(seconds);
return 0;
}
延迟函数整体的时间复杂度是 O(n),空间复杂度为O(1)
4.再来个堆排序
#include <stdio.h>
#include <assert.h>
//swap:交换a,b两数的函数
void swap(char* a, char* b) {
char t = *a;
*a = *b;
*b = t;
}
void heapify(char* arr, const int start, const int end) {
assert(arr != NULL);
if (start >= end) return;
int dad = start;
int son = 2 * dad + 1;
while (son <= end) {
if (son + 1 <= end && arr[son + 1] > arr[son]) {
++son;
}
if (arr[dad] > arr[son]) return;
swap(&arr[dad], &arr[son]);
dad = son;
son = 2 * dad + 1;
}
}
void heap_sort(char* arr, const int len) {
assert(arr != NULL);
if (len < 2) return;
//完全二叉树公式: son = 2 * dad + 1 or son = 2 * dad + 2;
//求dad: dad = (son - 1) / 2
for (int i = (len - 1) / 2; i >= 0; --i) {
heapify(arr, i, len - 1);
}
for (int i = len - 1; i > 0; --i) {
swap(&arr[0], &arr[i]);
//每次排完最大那个节点,数组尾部下标减一
heapify(arr, 0, i - 1);
}
}
void display(const char* arr, const int len) {
assert(arr != NULL);
for (int i = 0; i < len; ++i) {
printf("arr[%d]: %c ", i, arr[i]);
}
printf("\n");
}
int main() {
char arr[] = {10, 9, 8, 7, 5, 6, 3, 4, 1, 1};
printf("调用堆排序\n");
//数组长度,最好使用const修饰
const int len = sizeof(arr) / sizeof(arr[0]);
heap_sort(arr, len);
//打印数组
display(arr, len);
return 0;
}
堆排序包括建堆和排序两个操作,建堆过程的时间复杂度是 O(n),排序过程的时间复杂度是 O(nlogn),所以,堆排序整体的时间复杂度是 O(nlogn),空间复杂度为O(1)
5.小bug:
int cmp(const void* a, const void* b) {
return *(char*)a - *(char*)b;
}
qsort(arr, len, sizeof(char), cmp);//注意函数参数列表。已解决。
调用swap使用tmp额外临时变量更好,不容易出错。使用a + b 宏对char数组不行,未解决。
VS2022调用scanf()等不安全函数在文件最上面加_CRT_SECURE_NO_WARNINGS 宏/macro,告诉编译器忽略相关的警告信息。但为什么一定在文件最上面添加?还未解决。
今天先到这里吧!