算法03

  • 排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的
  • 那么之前我们学到的排序,选择排序,快速排序和堆排序是不稳定的  插入排序,冒泡排序和归并排序可以做到稳定,其实有人会考虑为什么要有排序的稳定性,我举一个小栗子:
  • 假如有一个表格类表,分别是  学号  班级  分数  第一次你按照分数排序,然后第二次你按照班级排序,这个时候如果你使用的是基于稳定的排序算法,相同班级的同学会在一起,而且相同班级内的分数也是排好序的。
  • 再来讲一下工程中的排序,听一个大佬说的以后我会考证一下,当一个数组长度很大,而且类型是基础类型(int double.......),会使用快速排序,当要排序的是自定义类型,里面是你自己定义的字段,而且是你自己定义的比较规则,那么会使用归并排序,但是当数组长度很小的时候,会使用插入排序,因为插入排序的常数项很低,其实这样一分析里面有一个坑,其实如果在数据量很大的时候,采用归并排序或者快速排序的话,一个很大的数据量在这两种算法下回慢慢被切成很小的数据量,当达到一个足够小的标准的时候,最后还是会使用到插入排序。
  • 归并排序的额外空间复杂度可以达到 O(1) 但是很难,不需要掌握,想了解的同学可以搜索“归并排序内部缓存法”
  • 其实快速排序也可以做到稳定性,但是也很难,论文级别,不要求掌握,有兴趣的同学可以搜索“ 01 stable sort”
  • 有一道面试题,一个数组中有奇数和偶数,要求将奇数放在左边,偶数放在右边,原来的次序不改变,时间复杂度为O(n)  额外空间复杂度为O(1),可能第一眼看过去会感觉这个问题很简单,但是其实不然,这个就像是快速排序的一个子过程,如果能够做出来这道题,那么你也可以让快速排序做到稳定性,但是我好想说过快速排序做到稳定性很难,嘻嘻,如果面试遇到了这道题,一个大佬告诉我直接怼他,并且告诉面试官这道题的来龙去脉,面试官并非良人,你甚至可以反问面试官,如果他也不会,你是可以举报他的.
  • 那么下面我们再来讨论一下你什么时候可以举报面试官,第一点:面试官阴阳怪气,甩情绪  第二点:他自己出的题目自己没有准备答案,如果他说是开放性的题目,那么他也应该要准备答案,只是期待你更好的答案,皮一下.

下面讲一下桶排序,其实桶排序是一个基于非比较排序的大类,这个类里面有计数排序和基数排序,计数排序就是我们日常了解的桶排序一种很简单实现方法,自行百度,基数排序在以后的博客给出。

题目:用数组实现一个栈,并且能够随时得到当前数据的最小值,操作时间复杂度是O(1):

  • 这道题,我们在入栈的时候准备两个栈,一个栈压入正常的数值,另一个栈存贮当前数据的最小值,然后我们就可以随时得到最小值了,两个栈弹出数据的时候同步弹出

题目:使用队列实现栈结构

  • 我们准备两个队列,假如其中一个队列里面加入了n个元素,然后现在我们要得到最后一个元素,可以将先入队列的 n-1 个元素进入另一个队列,然后得到最后一个元素,拿到第 n -2 个元素也和上面一样,将 n-3 进入另一个空队列,然后得到第 n -2 个元素

题目:使用栈实现一个队列结构

  • 我们使用两个栈,栈1 和 栈2 ,假设先往栈1 里面添加元素,然后我们将栈1的元素全部弹出并且压入栈2,这个时候栈2元素的弹出顺序就是和一个队列一样了,如果这个时候又有新的元素要进栈,让他进栈1,等到栈2的元素全部弹出后,才能将栈1的元素弹出到栈2,栈1就相当于一个接受器,然后栈2就是一个转换器,将栈的顺序转为队列
原文地址:https://www.cnblogs.com/luojianyi/p/9508705.html