1. 直接选择排序:时间复杂度为O(N²),从数组中选择一个最小元素与首位元素交换,然后从第二个元素到末尾元素之间选择最小元素与第二个元素交换,...。
2. 堆排序:时间复杂度为O(NlogN),用数组元素构造完全二叉树,调整节点顺序构造二叉堆,对二叉堆采用deleteMin或deleteMax操作得到最后排序结果。
3. 直接插入排序:时间复杂度为O(N²),举例说明
[2 4 1 3 5] //输入
[2 4 1 3 5] //把第一位看做已经排好序的子数组。选择第二位,与第一位比较,由于4>2,位置正确,无需调整。
[2 4 4 3 5] //选择第三位,与已经排好序的子数组[2 4]从末尾到首位依次比较,所有比第三位大的数往后挪一个位置。
[2 2 4 3 5] //2往后挪一位。
[1 2 4 3 5] //找到合适位置,坐下。
[1 2 4 4 5] //第四位,3,找自己的位置。
[1 2 3 4 5] //找到合适位置,坐下。
[1 2 3 4 5] //最后一位位置刚好合适,排序完成。
4. 希尔排序:时间复杂度为O(NlogN),设数组长度N,选择正整数增量序列ht=N/2,ht/2,ht/2/2,...,1,对于每一个增量hk,数组下标每距离hk取一个元素,得到一个子数组,一共得到hk个子数组,每个子数组都进行插入排序。
5. 冒泡排序:时间复杂度为O(N²),举例说明
[3 2 1] //输入
[3 1 2] //从后边开始,每次选择两个元素比较,如果逆序,则交换顺序。2、1逆序,交换它们。
[1 3 2] //所选的两个元素下标各向前移动一位,继续比较。3、1逆序,交换它们。完成一趟比较,最小数为1,已经冒泡到首位
[1 2 3] //从剩下的元素中继续执行以上步骤,选择次小数冒泡到第二位。总共执行N趟(N为数组长度)
6. 快速排序:时间复杂度为O(NlogN),举例说明
[7 6 5 4 3 2 1] //输入,检查数组长度,如果小于一定长度(最小长度是3),则采用直接插入排序。
[1 6 5 4 3 2 7] //三数排序。三数为首位7、末位1、中间位4
[1 6 5 2 3 4 7] //枢纽元放倒数第二位。枢纽元为三数中值4
[1 6 5 2 3 4 7] //下标i从第二位向后移动,停留在大于枢纽元的元素上;
i j //
下标j从倒数第三位向前移动,停留在小于枢纽元的元素上。
[1 3 5 2 6 4 7] //交换下标为i、j的两元素。
[1 3 5 2 6 4 7] //继续移动。
i j
[1 3 2 5 6 4 7] //交换。
[1 3 2 5 6 4 7] //一旦i>=j,停止移动。
j i
[1 3 2 4 6 5 7] //交换下标为i的元素与枢纽元4
[1 3 2 * * * *] //递归枢纽元左边子集...
[* * * * 6 5 7] //递归枢纽元右边子集...
7. 桶式排序:时间复杂度O(N),要求输入M个数据大小都限制在[0,N]之内,则可用大小为 N 初始化全为0的数组记录每个输入正整数累计出现的次数,输入完成后按序输出。
8. 归并排序:时间复杂度为O(NlogN),把一个数组对半分成两个子数组,分别把这两个子数组排好序,再把这两个子数组按大小顺序合并到一个新的数组中(方法是同时读取这两个子数组的各一个元素,对比大小,小的数写入新数组中,然后再对比下一对元素,执行同样操作,直到一个子数组读完,就可以把另一个子数组剩下的数全部写入新数组中)。对子数组排序采用递归归并排序方法。