一.计数排序
计数排序顾名思义通过计数进行排序(只能对数组进行排序,有一定局限性,但效率高)
基本思路:通过创建计数数组(哈希表),对每个数出现的次数按大小顺序进行标记,然后以该顺序改变需要排序的数组
代码如上。
二.归并排序
时间复杂度:(nlogn)
稳定性:稳定
归并排序的原理就是分而治之
利用递归(也可以非递归)将一组数分成两组,每组数又再次细分成两组直至无法细分下去,将每一组内的数进行排序,递归回上一次分组,再次进行排序,直至排序完成。
以下是递归算法的代码
三.简单选择排序
空间复杂度:(1)
时间复杂度:O(n^2)
稳定性:不稳定
原理:将最小值与最大值分别找出分别移到左右两侧
四.快排
时间复杂度:O(nlogn)
稳定性:不稳定
原理:右边找到大于key的数左边找到小于key的数交换,最后相遇与key交换此时的key值就在其有序的位置上。经过递归后所有数都会有序。
注:如果从左找大,再从右找小,会有bug,因为会将比key大的数换到key上
快排的优化算法:
三数取中:如果数组的顺序接近或本就是有序,快排算法会进行大量没必要的递归,导致效率低下,取到合理的中位数的key可以减少效率的损失。
小区间优化:
在数组递归区间如果较小,就没必要进行递归,减小递归可以增加效率,如果在一定区间内则可以利用别的排序方法进行排序;
五.冒泡排序
时间复杂度;O(n^2)
稳定性:稳定
每次内循环都找到最大的数放入末尾。
循环至有序。
六.插入排序和希尔排序
时间复杂度:O(nlogn)
稳定性:不稳定
原理:选取一数不断比较插入到合适的位置
希尔排序:
时间复杂度:O(n^1.3)
稳定性:不稳定
原理:在插入排序基础上,进行了分组排序,进行的预排序可以解决插入排序在遇到倒序数组时效率低下的问题。
七.堆排序
时间复杂度:nlogn
利用建堆的方法进行排序;
向上调整法:
先用向上调整法使无序的数组调整成小堆,或大堆,之后首尾元素相换,尾元素即最大或最小值,保留最大或最小值,之后使剩余元素向下调整,重新找出最大或最小值,循环操作,可以排出有序数组
向下调整法: