前言
排序的概念
排序是计算机将一组无序的序列按照关键字顺序调整为有序的序列的操作。按照是否全部排序过程是否能够在内存中完成,排序可分为内部排序和外部排序。
常见的排序算法
内部排序
1.插入排序
直接插入排序
算法描述:从第一个元素开始,假定前面的元素有序(以升序为例),取出当前元素,从前一个元素逐个往前比较,若比当前元素大,就后移一格,若小于等于当前元素,就将当前元素放入当前空位。
直接插入排序的稳定性:稳定,因为碰到等于当前元素的元素就停下了。
算法复杂度分析:
时间复杂度:
(1)最好情况-本就顺序,或者十分接近顺序O(n)
(2) 最坏情况-本就逆序,或者十分接近逆序O(n^2)
(3) 平均情况 O(n^2)
空间复杂度:
在同一时刻只需要缓存一个元素的值,O(1)
没太大用的优化:折半插入排序
折半找到元素应该插入的位置,移动元素(移动元素复杂度不变!)插入。
代码实例:
打桩
希尔排序
算法描述:先将排序表按照增量d(子表元素在主表的距离)分割成子表,子表内部进行插入排序,逐步减小增量d,一直重复上述过程,直到d=1为止。
注:希尔排序在本就有序的序列的性能非常好。
希尔排序的稳定性分析:虽然直接插入排序是稳定的,在不同的子表中元素移动时有可能会打破稳定性,所以希尔排序是不稳定的。
算法复杂度分析:
时间:
希尔排序的时间复杂度比较难计算,目前没有数学手段能够证明希尔排序的时间复杂度,在n在某个特定的范围时为O(n^1.3),最坏时间复杂度在反序时为O(n^2),总之,希尔排序的新跟那个比直接插入排序要好。
空间:
同一时间之内只会缓存一个交换中间变量,空间复杂度O(1)。
代码实例