####一点题外话。周五晚上参加了“大神0距离"活动,深刻体会到了自主努力学习对自己未来的改变是多重要。最近一直心浮气躁,直到听完实验室大神的分享,我才意识到自己当前的状态无比的差,为一些乱七八糟的事儿整日不在状态是在严重浪费时间。
Linux实验室的刘嘉辉学长凭着对计算机的热爱,不断地学习,参加比赛获奖,去西班牙交流活动,拿到实习offer。同时他也享受着生活,做着自己喜欢与真正想要做的事情。对于计算机行业来说,这是一件很困难的事情。
听完交流,感慨良多。迷迷糊糊的乱学习真是会让人心里对未来有一丝迷茫甚至恐惧。近日一直在考虑一个问题,大一快结束了,我学到了什么?这几日总在想,总觉得自己什么都没有学到,没有什么擅长或拿得出手的东西,反而心情变差的有些影响我的日常学习与计划,现下唯有调整好自己,重新出发。
无论是好是坏,在自己真正努力过后,都接受。
要相信没有白走的路,每一步,都算数。
##学习总结
部分常用排序的总结包括(冒泡排序,快速选择排序,堆排序,简单选择排序,树形选择排序)
-
冒泡排序
(c语言基础算法,必须掌握的一种排序。)
给定一串数字:
<1>、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
<2>、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
<3>、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
<4>、持续每次对越来越少的元素比较,重复上面的步骤,直到没有任何一对数字需要比较,这样一串数字就排好大小了。 -
堆排序
堆排序是排序过程中,将向量中存储的数据看作是一颗完整的二叉树。利用堆这个数据结构而设计的一种排序算法。属于一种选择排序。
堆的每一个节点的值都大于或者等于左右孩子节点的值,称为大根堆。基本思想:
将待排序列构造成一个大根堆,此时整个序列最大值是堆顶的根节点,将其与末尾元素进行交换,此时末尾变成了最大值,然后将剩余元素继续构造成一个堆,这样会得到n个元素的次小值,再次交换,然后反复执行,就得到了一个有序序列。
举个详细例子:
给定一数组a[5]={3,6,8,5,7}:
插入6的时候,6大于他的父结点3,即a[1]>a[0],则交换;此时,保证了0~1位置是大根堆结构,如下图:
插入8的时候,8大于其父结点6,即a[2]>a[0],则交换;此时,保证了0~2位置是大根堆结构。剩下的以此类推,直到该数组成为一个大根堆结构。 -
快速选择排序
先说说选择排序:
选择排序的基本思想:
每一趟(例如第i趟)在后面的n-i+1个待排序列的元素中,
选取关键字最小的元素作为有序子序列的第i个元素。直到第n-1趟做完排序元素只剩下一个,就不用再选了。快速选择排序:
**通过两个不相邻元素的交换,消除待排序列中的多个逆序,从而大大加快了排序的速度。**这也是相比于冒泡排序的优点所在。通过一次交换就可能消除多个排序。基本思想:
找一个枢轴,也就是一串数字中的一个数(最好不要是给定一串数里的最大值),然后以枢轴为中介线,一边都小于他,另一边都大于他,然后对两边的区间继续进行划分,所以如果枢轴的选取是最大或者最小值,选择它就没有起到划分的作用。快速排序的效率也会降低。所以每次在选择枢轴时,在序列的第一个,中间或者最后三个数字里面进行选择是最好不过的。可以保证每次划分接近均等。 -
简单选择排序
基本思想:
假设排序表为 a[n] ,第i趟排序即从a[i,n] 中选择关键字最小的元素与 a[i] 交换,每一趟排序可以确定一个元素的最终位置,这样经过 n-1 趟排序就可以使整个排序表有序。 -
树型选择排序
树形选择排序,是在简单选择排序的基础上进行了改进,在简单选择排序中,首先从n个记录中选择关键字最小的记录下来,需要n-1次比较,从n-1个记录中选择关键字最小的记录下来,需要n-2次比较,,,,然鹅每一次都没有利用上一次的比较结果,所以这一排序保存了比较过程中的大小关系。基本思想:
先把待排序列n个关键字进行两两比较,取出较小者。然后再在a[n/2]个较小者中采取同样的方法,进行比较选出每两个里面的最小的一个,如此反复,直到选择出所有元素中最小的那一个。