比较排序:
涉及知识:
分治法:将一个问题分解成规模更小、结构相似的子问题,解决问题A,变成了解决问题A1和A2,解决问题A1变成了解决问题A11和A12。。。,一直到最小单元,当最小单元问题解决后,依次向上返回,问题A得以解决。因为问题和子问题之间解决思路是相似的,所以解决时会调用相同的程序体,表现为问题调用自己解决子问题,而结果则是从最小单元依次向上返回,称之为递归。在递归过程中,子问题的规模不断在缩小。
1. 插入排序:在已排序好的序列中,给要插入元素找到并空出应在位置,并插入该元素。
2. 合并排序:将排序分解为合并两个内部已排好序的子序列的问题,表现为先排序分拆的子序列再递归合并。
3. 冒泡排序:每次必将一个最大或最小元素像水中气泡一样,升到最高水面(放在序列最前面),关键:在冒泡的过程中,顺便会交换排序不对的两个相邻元素,这点与选择排序不同。例:3,2,6,5,4,在4冒泡时,会将4放置到6的前面,然后再让2冒泡;而选择排序只会对比得出4大于2,让2放到最前,4的位置不变化。
4. 堆排序:利用最大/小堆的所有子树根节点的值都是最值的特点,建立堆,取根节点,对剩余元素继续建立堆,通过此过程实现排序。
5. 快速排序:使用一个分界点,将一个序列分成小于和大于分界点的两个子序列(子序列内部并未排序),表现为先设置分界点划分两个序列,再递归排序每个子序列。
非比较排序:
涉及知识:
稳定排序:进行排序的相等元素,在输入和输出时的相对位置保持不变。
1. 计数排序:记录每个元素出现的次数,计算得出每个元素应该在的位置。该排序方法要求知道排序元素是那些,才可实现对这些元素进行计数。该排序可以是稳定排序。
2. 基数排序:从低位向高位逐列排序。低位排出一个顺序,如果高位不能改(相等),那么保持顺序不变(所以高位排序要求是稳定排序),如果高位能改,那么按照高位改变排序。由低向高排序的原因,由高向低排序时,低位无权修改高位的排序,因为需要数据按照高位的值分成不同部分(1的在一起,2的在一起。。。,避免低位修改了高位排序),再在每个部分内部进行低位排序。
3. 桶排序:通过对比元素和桶基数,将元素散布到多个桶中,(也是一种hash算法),再将桶内元素排序,即可实现排序。