以下排序均为升序。
1.冒泡排序(稳定)
比较相邻两个数的大小,如果 前<=后 则不交换,如果 前>后 交换,每次外循环后末尾都会增加一个有序的数,所以下一轮内循环要缩减范围。
2.选择排序(不稳定)
每轮内循环找到最小元素的下标,然后将它移到最前面,因此每一轮的搜索范围都在减小。
3.直接插入(稳定)
每一次循环都需要将当前的值向前插,插的原则是找比他大的。
4.快排(不稳定)
首先选择一个数作为比较对象,然后将数组中比他小的放到左边,比他大的放到右边,然后递归对左右子数组做同样操作。并且为了避免最坏的情况,即倒序的情况(此时时间复杂度为n2), 选择的这个数需要一点随机性,而不能总是选择左边的。
5.归并排序(稳定)
首先将数组递归平均分割,直到无法分割为止,然后每两个一组进行排序(实际上是每两个数或三个数一组进行排序),归并成一个数组,不断归并成原来长度的数组。
6.堆排序(不稳定)
先是根据数组构建大根堆,即完全二叉树,保证每个节点都大于它的左右节点(构建堆的过程也是调整的过程,只不过调整的范围是从length/2开始)。然后将堆顶元素和结尾元素交换,并重新对除了最后一个数字的数组进行调整,再次调整成大根堆,往复循环。。。
7.桶排序(桶排序的稳定性取决于桶内排序所使用的算法,若使用插入排序,则是稳定排序,若使用快排,则是非稳定排序。计数排序的升级版)
原理是将该数组中的数放到各个桶(桶跟桶之间是有序的)当中,然后对桶内的数进行排序。