自学内容网 自学内容网

我的创作纪念日

学习总结

前言

大家好,很高兴又和大家见面啦!

从2023.8.19到今天一眨眼,一年多就过去了。我从2023.10.01在C站发表了第一篇文章——猜数字,到2024.10.01刚好就满一年了。原本这篇文章应该在2024.09.30那天发布,但是我这段时间现实生活中的事情有点多,所以一直往后再拖,直到今天才有机会发布这篇纪念文章。

今天这篇文章,主要是我自己对来C站这一年的一个总结,以及自己的一些心路历程……

一、人生之路的抉择

我大学本科专业是给排水科学与工程,毕业后工作了2年多,在经历了社会的无情拷打后,万念俱灰的我,在听从了大学室友的建议,尝试着加入了考研大队。

但是对于考研的方向,我又一次陷入了迷茫,原本想着要不就直接考本专业好了,但是我是真不喜欢这个专业的工作,以至于我在脱产前只从事了九个月的本专业的工作。

之后,我自己思考了很久,于是在回顾完自己的中学生活后,我最终做下了决定——跨考计算机。

我的大学是一个双非二本,并且我自己的大学生活也是一门心思在兼职赚钱上,并未认真的对待学习,因此我时常会反思自己的大学四年,就学习的角度来看,我是切切实实的荒废了这宝贵的四年,从人生的选择上来看,我也是实打实的走了一些弯路。

这一次我不想继续虚度自己的人生,我想好好的为自己的未来拼一把。

1.1 为什么会选计算机呢?

之所以选择计算机,大致可以总结为以下几点原因:

  1. 这个专业是我高中时的梦想,不过很可惜因为分数不够,最终被调剂到给排水
  2. 这个专业就工作薪资来看,还是十分可观的
  3. 我这个人比较热衷于自己动动手完成一些事情,我会在取得成果的时刻获得巨大的成就感

基于上述原因,我也便从2023.08.19晚上23:30正式开启了我的编程之路,并且在这段时间内,我也获取了满满的成就感:

  1. 完成了C语言阶段的文字交互小游戏编写
  2. 通过博客完整记录了自己的学习过程
  3. 通过博客我也结识了一些朋友和大佬,如哈哥

1.2 为什么开始写博客呢?

对于我自己的个人博客而言,在学习初期,我是通过B站鹏哥的视频中介绍的学习方法——通过博客来对学习的知识点做一个记录总结。

当时我看的是比较老的版本,那个视频中推荐的编译环境是VS2019,推荐的博客网站是51CTO,于是从2023.08.20开始,我就在51CTO上更新了自己的第一篇博客。

当时博客对于我而言就是一个学习笔记,我会在写博客的过程中不断的对自己进行提问,然后自己去进行解答,并且这个过程我也会一一记录下来,这也是因为我希望如果有跟我一样的编程小白在学习初期能够通过我的博客内容,少走一些弯路。


二、这一年的小结

2.1 博客开设的专栏

截止到目前为止,今年我总共发布了67篇博客,其中包括以下专栏的内容:

这些专栏的内容中,【C语言必学知识点】我算是完成了全部内容的更新,目前还在继续更新【C语言加油站】,C语言的内容并不是说只要把这些必学知识点给学会就万事大吉了,之所以开设【C语言加油站】这个专栏,也是因为我想在今后学习与运用C语言的过程中继续给大家分享C语言的一些拓展知识点。

2.2 这一年的收获

在这一年中,我自己最大的收获在于专业知识的储备更上了一层楼,2023年开始更新博客时,我是刚刚才开始接触编程,并且通过自学完成了C语言的基础知识点的学习,以及数据结构的学习,那4个月的时间其中3个月我是边上班边自学,所以学习效率并不高,每天只能等下班后加班加点的学习并进行对应博客的编写,经常是博客写到一点多两点的样子然后才能睡觉,第二天还要早起上班。

在这种状态下,我自我感觉我是工作没做好,学习也没有搞好,为了摆脱现状,我便决定脱产专心学习了,在开始执行后我发现,随着时间的推移,我对自己越来越有自信,对自己的选择越来越满意,感觉冥冥之中就是在指引我走上这一条路。

因此在这样的心态下,我陆续开设了上述这些专栏,并且对不同的专栏有着不同侧重点的更新,不过可惜的是,我目前的博客更新速度是更不上我的学习速度的,不过接下来的时间我们继续调整,慢慢的完善自己。


2.3 每天的日常

就目前而言,我的主要目标还是考研为主,为了找到一种适合自己的考研学习状态,我有给自己设定两种任务:

  • 日常任务——每天无论是否有状态学习,都必须要完成的任务
  • 考研任务——根据自己的学习情况为每天进行考研内容的学习安排

我每天的生活除了吃饭睡觉,就是学习了,熟悉我的朋友应该知道,我前段时间的博客更新都是月更,每个月固定更新七到八篇,对于博客的评论,我都会一一的顺着评论进行回访,不过这个月开始,我可能就要停更一段时间了,接下来博客的三连回访我还是会继续进行,但是博客的产出需要进行缩减了,因为我需要调整一下自己的学习策略了。


2.4 学习上的成就

经过这段时间的学习,我对于数据结构部分掌握的还是挺不错的,比如排序这一部分,我有自己实现插入排序、选择排序、交换排序、归并排序、计数排序以及桶排序,这里我给大家展示一下我自己实现的部分排序算法:

//插入排序
void InsertSort(int* a, int len) {
for (int i = 0; i < len - 1; i++) {
int key = a[i + 1];//取出待插入对象
int j = i;//左侧有序插入起点
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];//元素右移
j -= 1;//指针左移
}
a[j + 1] = key;//插入元素
}
}
//希尔排序
void ShellSort(int* a, int len) {
for (int gap = len / 2; gap; gap /= 2) {
for (int i = 0; i < len - gap; i++) {
int key = a[i + gap];//取出待插入元素
int j = i;//左侧有序插入起点
while (j >= 0 && a[j] > key) {
a[j + gap] = a[j];//元素右移
j -= gap;//指针左移
}
a[j + gap] = key;//插入元素
}
}
}
//两数交换
void Swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}

//选择排序
void SelectSort1(int* a, int len) {
//升序排序,左侧为最小值
for (int min = 0; min < len; min++) {
//从排序对象右侧寻找更小值
for (int i = min + 1; i < len; i++) {
//找到更小值
if (a[i] < a[min]) {
Swap(&a[i], &a[min]);//两数交换
}
}
}
}
//选择排序——优化1:双指针
void SelectSort2(int* a, int len) {
//双指针优化——升序排序,最左侧为最小值,最右侧为最大值
for (int min = 0, max = len - 1; min < max; min++, max--) {
//以最小值为起点开始遍历排序数组
for (int i = min; i <= max; i++) {
//找到更小值
if (a[i] < a[min]) {
Swap(&a[i], &a[min]);//两数交换
}
//找到更大值
if (a[i] > a[max]) {
Swap(&a[i], &a[max]);//两数交换
}
}
}
}
//向下调整
void Adjust_Down(int* a, int len, int parent) {
int child = parent * 2 + 1;
while (child < len) {
//升序建大堆——右兄弟大于左兄弟
if (child + 1 < len && a[child] < a[child + 1])
child += 1;//指针指向右兄弟
//孩子大于父结点
if (a[parent] < a[child])
Swap(&a[parent], &a[child]);//父子交换
//向下遍历
parent = child;
child = parent * 2 + 1;
}
}
//建堆
void CreateHeap(int* a, int len) {
for (int i = (len - 1) / 2; i >= 0; i--) {
//向下调整
Adjust_Down(a, len, i);
}
}
//堆排序
void HeapSort(int* a, int len) {
//建堆
CreateHeap(a, len);
//排序
for (int i = len - 1; i > 0; i--) {
Swap(&a[i], &a[0]);
Adjust_Down(a, i, 0);
}
}
//交换排序——冒泡排序
void BubbleSort(int* a, int len) {
//排序总次数
for (int i = 0; i < len - 1; i++) {
//一次排序中的交换次数
for (int j = 0; j < len - i - 1; j++) {
if (a[j] > a[j + 1]) {
Swap(&a[j], &a[j + 1]);
}
}
}
}

//Hoare版本
int Partition1(int* a, int left, int right) {
while (left < right) {
//关键字位于左侧,从右侧开始遍历
while (right > left && a[right] >= a[left])
right -= 1;//右侧元素大于等于关键字,则移动右侧指针
//左右指针不相等且右侧元素小于关键字
if (left != right)
Swap(&a[right], &a[left]);//交换左右元素
//完成交换后,此时关键字位于右侧,从左侧开始遍历
while (left < right && a[left] <= a[right])
left += 1;//左侧元素小于等于关键字,则移动左侧指针
//左右指针不相等且左侧元素大于关键字
if (left != right)
Swap(&a[right], &a[left]);//交换左右元素
}
return left;
}
//挖坑法
int Partition2(int* a, int left, int right) {
//挖坑
int key = a[left];
while (left < right) {
//坑在左侧,从右侧开始遍历
while (right > left && a[right] >= key)
right -= 1;
if (left != right)
a[left] = a[right];//填坑
//坑在右侧,从左侧开始遍历
while (left < right && a[left] <= a[right]) 
left += 1;
if (left != right)
a[right] = a[left];//填坑
}
a[left] = key;//填坑
return left;
}
//双指针法
int Partition3(int* a, int left, int right) {
int key = a[left];//记录关键字
int f = left, s = left + 1;//快指针指向的元素大于等于关键字,慢指针指向的元素小于等于关键字
while (f <= right) {
//快指针指向的元素大于等于关键字
if (a[f] >= key) {
f += 1;//右移快指针
}
//快指针指向的元素小于关键字
else {
//当慢指针与快指针间隔大于1
if (s + 1 != f)
s += 1;//移动慢指针
Swap(&a[f], &a[s]);//交换快慢指针指向的元素
}
}
return s + 1;
}
//快排优化——随机数取中
int Partition4(int* a, int left, int right) {
//获取随机下标
int mid = rand() % (right - left + 1);
//与左侧进行交换
Swap(&a[left], &a[mid]);
//通过双指针实现
int key = a[left];
int s = left, f = left + 1;
while (f <= right) {
if (a[f] <= key && ++s != f)
Swap(&a[s], &a[f]);
f += 1;
}
return s + 1;
}

//快速排序1——Hoare版本
void QuickSort1(int* a, int left, int right) {
if (left >= right)
return;
int key = Partition1(a, left, right);
QuickSort1(a, left, key);
QuickSort1(a, key + 1, right);
}
//快速排序2——挖坑法
void QuickSort2(int* a, int left, int right) {
if (left >= right)
return;
int key = Partition2(a, left, right);
QuickSort1(a, left, key);
QuickSort1(a, key + 1, right);
}
//快速排序3——双指针
void QuickSort3(int* a, int left, int right) {
if (left >= right)
return;
int key = Partition3(a, left, right);
QuickSort1(a, left, key);
QuickSort1(a, key + 1, right);
}

这些算法的介绍我会在【数据结构】专栏中进行更新,不过估计得等2025年了。

经过这段时间的学习,我也明白了一个学习的正确打开方式——输入->输出->反馈。对于这个方式可能有朋友不太理解,下面我就来简单的解释一下。当我们要学习一个知识时,我们需要以下三个步骤:

  • 首先就需要有正确的输入——对于一个知识点,我们需要学习正确的内容
  • 其次要有对应的输出——在学习完知识点后,我们需要进行知识的输出来巩固知识点
  • 最后要有及时的反馈——反馈不仅可以给我们进行知识点的查漏补缺,而且还能增加我们的自信心与成就感

输出的方式可以是做题,对应的反馈就是答案的正确性;可以是写博客,对应的反馈就是读者的真实反馈;还可以是教学,对应的反馈就是教学的对象对教学内容的掌握情况……

我在前面的学习中都是采用的刷题与博客的输出方式进行知识点的巩固与强化,不过这样就导致了我的学习进度大打折扣,为了弥补这个缺陷,我打算在接下来的时间里,采取先输入,再输出博客的方式,也就是先把知识点学完,再对学习的知识点通过博客进行复习、总结。因此后续的博客更新我会暂停一段时间,全面的进行知识点的输入工作。


三、对接下来的学习规划

在接下来的学习中,我会以高数为主要科目进行学习,同时穿插学习408的内容,对于C语言部分,我目前有计划【C语言加油站】专栏中的几篇文章以及【实战项目】中的几篇文章,对应的内容也会在后续进行及时的更新。

【数据结构】的内容目前我是已经学完了,但是博客还停留在【二叉树】的篇章,之后我也会继续进行更新【二叉树】的遗留文章以及【图】、【排序】等章节的内容。

408的内容我计划是在25年开始进行后续的创作与更新,对于计算机语言类的专栏【C++】、【Python】我是打算先停一段时间,但并不代表着我对这一块就不再进行输入了,只不过在后面的学习过程中会减少这一块内容的占比,【Linux】的内容在后面可能会在408的内容更新完后作为重点更新的专栏。

最后,送给自己一段话:

不要在意结果如何,自己只需要过好每一天,争取每天进步一点,然后就是顺其自然。
我们期待的结果只会当我们的能力与之匹配后才能够获得,不要妄想一步登天,放平心态,稳步前行。
当我们的能力达到时,该有的都会有的,即使现在孤身一人,也不必惊慌,这正是磨炼自我的最佳时机,不受拘束,不被干扰,能够按照自己的想法来进一步的完善自己。
当我们大步朝向自己的前途前进时,我们会发现,对的人,对的事都会在这个旅途中等待着我们的到来,所以当下我们需要做的就是努力前行。
加油吧!我们是最棒的!!!


原文地址:https://blog.csdn.net/2301_79458548/article/details/142729012

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!