简单排序
冒泡排序
不断向下(向上)比较相邻两个位置,如果顺序不对,则交换位置
从而可以找到每一趟的最小值,并放在最下方
插入排序
和打扑克抓牌一样,通过比较找到位置,移出空位,插入
简单选择排序
选出最小或最大的然后交换位置
希尔排序
每一趟以不同间隔进行选择排序
定义增量序列 DM > DM-1 > … > D1 = 1
对每个 Dk 进行“Dk-间隔”排序( k = M, M-1, … 1 )
高效的增量序列
- Hibbard 增量序列 Dk = 2k – 1
- Sedgewick增量序列 94i–92i+1或 4i–3*2i+1
堆排序
生成最大堆,把堆顶元素和最后一个元素进行交换,对去掉一个最后元素(最大值本来就该在最后面)的新堆进行调整,再交换,再去元,再调整,周而复始,直到堆只剩一个元素。排序结束
归并排序
核心:两个有序子序列不断的归并
开辟临时数组,序列两两归并(若多出一序列,并入最后一个合成序列)放入临时数组,序列长度2,周而复始,直到序列长度大于数组。其中为节省空间,临时数组可以用一个临时数组与原数组进行来回倒。
快速排序
选主元抽样(一般是头中尾)取中位数
根据元素相对主元的大小,将集合分为两个集合
不断进行集合拆分(递归),直到集合大小达到某一值时,对集合内的元素进行简单排序
表排序
定义一个指针数组作为“表”,排指针即可,节省内存拷贝的时间。
若非要进行内存排序,根据上一步的表,建“环”,根据环,进行内存位置调整,节省内存拷贝时间
基数排序(桶排序)
“建桶”,如果某些条件有序时,则元素有序。一种条件为一个过程,一种情况为一个桶。如1000以内的数有序,条件为百、十、个位数有序,情况为0-9。
排序顺序
- LSD(次位优先):条件重要性逆序
- MSD(主位优先):条件的重要性顺序