前言
在这一周里收到了两份笔试的通知,两家试卷都有不少的或涉及原理或设计特点的排序题,对排序一知半解的我吃了不少亏,今天写这篇博文对排序做一下整理。
概述
较为重要的排序有冒泡排序,选择排序,插入排序,归并排序,快速排序与堆排序,这些在这两次笔试中或多或少都有出现,就针对这几个排序进行算法原理与特点的整理。
各排序算法原理
冒泡排序
冒泡排序就是不断比较相邻的元素,大的元素排后面,小的排前面,每一次循环比较出一个最大值放在右边,直到所有元素都两两比较过循环才结束。
选择排序
遍历未排序列,每次循环将最大或最小值记录,一次循环结束后将最大或最小值放在队头或队尾。
插入排序
从第一个数开始,将序列当作一个有序序列进行排序,每次都将循环到的数插入到前面的有序序列中,直到所有元素完成插入,序列就变得有序了。
归并排序
递归的思想,将数组分成两半,再对两侧的数组归并排序再整合两半数组,整合的规则是比较两半最小值,小的先存放在另外开辟的空间中,直到一个数组遍历完成,将另一个数组未遍历部分(数组已排完序)放进开辟的空间的后面。
快速排序
每次将未排序序列的第一个数作为基数,后面每个数与这个基数进行比较,小的放在这个基数的前面,大的放在这个基数的后面,直到所有元素都当过基数,排序结束。
堆排序
堆排序运用类似二叉树的堆积的形式完成排序,先将所有元素依次放入这个类似二叉树的结构中,从下至上将三个数中较大值放在根节点位置,直到根节点为最大值。之后根节点放在外面,取出最后一个节点放在根节点位置,与子节点比较,较大的放在根节点位置,一次循环直到取出的最后一个节点找到它相应的位置停止,然后重复取出根节点和最后一个节点的操作,直至排序结束。
拓展
基础排序算法还有计数排序,桶排序,基数排序等。
计数排序非排序算法,使用该算法要求序列中所有值在较小的范围内且重复出现多次,它会建立一个较大的数组如(1-100)存储数出现的次数,再依1-100的次序输出。
桶排序是分为固定的多个区间即桶,如0-9,10-19,20-29,将所有数据按他们自身大小存入桶中,桶中使用何种算法试情况而定。
基数排序是将一个数的每位数进行拆分再进行排序。
各排序算法特点
主要关注时间复杂度与稳定性。
时间复杂度即程序执行程序需要的时间,可以简单理解成循环中的次数。
稳定性是看排序过程中,同权重的值(简单理解就是值相等)排序前后前后位置关系是否改变。
总体的速度上(归并、堆)> 快速 >(冒泡、插入)> 选择
参考网站:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html