内部排序:数据在内存内排序
外部排序:极为庞大得数据,内存里不能全部容纳,排序时需要访问外存
排序的稳定性:大小相同的元素排序前后顺序不发生改变
1.冒泡法
小的元素或大的元素往后调,属于稳定排序
改进:1.加flag,若某趟无交换说明已排好,直接return
2.加postion,记录之前已有序的位置
3.从两边冒泡
2.快速排序法
通常是第一选择
有序时会退变为冒泡排序
已某个元素为中间值,选两个哨兵,从两边读数,小于中间值放左边,大于放右边。迭代进行
改进:1.取头尾中间三值,以大小居中作为中间值
2.当子序列规模较小时用直接插入排序
不稳定排序
3.选择排序法
选最小的与第一个交换,再选第二小的与第二个交换,再.......
改进:二元选择排序,每次排最小和最大的放到两边
不稳定排序
4.堆排序
对选择排序的改进
小顶堆:根结点比左右子树小
大顶堆:根结点比左右子树大
不停取出堆顶元素
分两步:建立小顶堆:从最下面的非叶结点开始,逐渐往上(下面的结点仍需处理)
调整堆:去除堆顶,将堆底元素置换到堆顶再调整堆
不稳定排序
5.插入排序
一个一个得添加元素并排序,稳定排序。时间复杂度O(n)
还可以二分插入排序(感觉没什么软用)
6.希尔排序
设有123456789,先排15,26,37,48,9,再排1357,2468,9,最后排123456789(这只是特例),希尔排序里有直接插入排序
不稳定排序
7.基数排序
由桶排序衍生而来
稳定排序
8.归并排序
用辅助数组来进行分段后的排序,即有序组A,B,依次放入C
稳定排序
当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。