排序算法学习报告

对于学习本身,存在很多误区,特此写这篇学习报告来复习知识、调整认知。
认识基础需要接纳一些关于学习上的认识事实。
  • 学习是一个连续的过程:理解-表达-运用,后面的都会检验前面的步骤。
  • 学习过程贯穿着记忆、遗忘、错误、情绪杂念,这些必然存在,接纳这些存在;
  • 学习过程的每一步都需要检验。
  • "理解-表达-运用",会遗忘需要复习

学习时间:2021-2-21至2021-2-24
学习方式:10小时视频学习
学习过程:理解概念和关系后,通过默敲来表达,解leetcode题来应用
学习进度:理解和表达,未应用
编程语言:java
学习注意点:排序的最优解、时间复杂度、排序稳定性(两个相同的元素,排序完成状态和未排序状态的相对位置不改变)、原地排序(1-7)、辅助排序(8-10)
学习内容:10种排序算法

1、冒泡排序

内容:针对未排序数组中的每一元素进行相邻地两两比较,根据大小进行位置交换;
优化:减少比较次数
a、每一元素循环如果不出现交换则已排序完成,break
b、每一元素循环时,已排序的元素不需要再次比较,记录已排序的位置。

2、选择排序

内容:按照数组大小进行循环,每次找到最大值的下标,将其与本次循环的最后一个元素交换。
优化:堆排序

3、堆排序

内容:对未排序的数组进行自建堆heapify,然后每次将堆顶和末尾交换,长度自减1后下滤直至堆长度等于1。

4、插入排序

内容:将未排序数组中的每一元素,和前面已排序完成的元素进行比较交换。
优化:减少比较次数,
a、和前排比较找到插入位置,然后元素挪动插入
b、二分查找找到插入位置,然后元素挪动插入

5、归并排序

内容:对未排序的数组多次二分直至只剩下一个元素,再将分好的元素重新合并,合并过程是各取两部分数组中的一个比较后插入。

6、快速排序

内容:选首元素作为轴元素和首末的指针,从右往左遍历元素,和轴元素比较找到比轴元素小的元素,将其覆盖首指针,首指针+1,再从左往右遍历,找到比轴元素大的覆末指针,末指针-1。到首末指针相等,轴元素覆盖中间。
以轴元素划分为两部分数组重复以上过程。
优化:一直选取轴元素可能造成比较次数增加,可随机选取一个元素和首元素交换

7、希尔排序

内容:给定一个序列如{16,8,4,2,1}(n/2^k),按序列数为标准划分数组成几行,按竖列进行排序,直至序列循环完毕即可。

8、计数排序

内容:找到最大值,按最大值新建一个统计数组,遍历待排数组统计元素出现的次数,最后按统计数组遍历出有序序列
缺点:浪费空间,无法排序负数,排序不稳定。
优化:找出最大值同时找出最小值,新建最大最小值范围的数组,可解决空间浪费和负数排序问题,统计元素频率,将频率加上前一元素的频率,反向遍历原数组,生成有序序列。

9、基数排序

内容:找出最大值,按位数从个位开始进行计数排序,直至最高位。
优化:新建二维数组作为桶,按位数从个位开始将元素分别放入桶中,再遍历所有桶赋值原数组,直至最高数。

10、桶排序

内容:按数组大小新建多个动态数组或链表(桶),将元素按一定规则均匀存入桶中,单独对桶进行排序,最后将不空的桶组合成有序序列。


学习效果分析:

  • 今天重新回想三天前的内容,发现1,2,3,4已经遗忘部分内容,有些已经想不起来了,这是遗忘很正常。
  • 学习以上知识是经过理解-表达的过程,产生一个疑问
  • 从理解上来讲,还是会遗忘关键的原理,说明理解程度明明不够,总自以为理解了,理解更新一个标准。
  • 从表达上讲,默敲过程其实还是有参考视频教程的代码,所以表达的程度不够,表达也需要更新一个标准,除了默敲还可以写学习报告或说给人听。
  • 遗忘其实是再次记忆的时刻,回想越艰难记得越牢靠。 -- 《认知天性》
  • 最后,我想我应该去找运用了。。待续

你可能感兴趣的:(java后端算法-数据结构)