目录
一、插入排序
1、直接插入排序
将一组数据分为有序区和无序区,依此将无序区的记录插入到有序区中。
已知关键字序列{75,68,87,92,88,61,80,72}
平均时间复杂度O(n^2)
空间复杂度O(1)
2、折半插入排序
也叫作二分插入排序
折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法。
已知关键字序列{75,68,87,92,88,61,80,72}
平均时间复杂度O(n^2)
空间复杂度O(1)
3、希尔排序
将数据分组,将每一组进行插入排序,每一组排成有序后,最后整体就变有序。
已知关键字序列{75,68,87,92,88,61,80,72}
平均时间复杂度约为O(n^1.3)
空间复杂度O(1)
二、交换排序
1、冒泡排序
依次比较两个数的大小,如果与所需顺序不同则交换。
已知关键字序列{75,68,87,92,88,61,80,72}
平均时间复杂度O(n^2)
空间复杂度O(1)
2、快速排序
对无序的序列进行比较和划分,分成的两个序列再进行比较划分,直到全部有序。
单趟排序的思路是:取区间中最左或最右边的元素为key,定义两个变量,这里假设是p和q,q从区间的最右边向左走,找到比key小的元素就停下。p从最左边向右走,找到比key大的元素就停下。
已知关键字序列{75,68,87,92,88,61,80,72}
时间复杂度O(nlogn)
空间复杂度O(nlogn)
三、选择排序
1、简单选择排序
选出最小的/最大的放在首位,剩下的再选最小/大的放在第二个,直到排序完成。
已知关键字序列{75,68,87,92,88,61,80,72}
时间复杂度O(n^2)
空间复杂度O(1)
2、堆排序
将带排序的序列构造成一个大根堆(小根堆),将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大根堆,如此反复,从第一次构建大根堆(小根堆)开始,每一次构建,我们都能获得一个序列的最大值(最小值)并把它放到大根堆(小根堆)的尾部。直至排序完成。
已知关键字序列{75,68,87,92,88,61,80,72}
构建大根堆:
将最大元素和最后一位互换位置,得到新的堆:
最后一位固定,其余元素继续进行构建大根堆:
此时88与80交换位置,得到:
反复执行构造大根堆,交换堆顶元素与末尾元素位置两步,直到所有元素都固定:
此时得到的序列{61,68,72,75,80,87,88,92}即为所需要的序列。
平均时间复杂度O(nlogn)
空间复杂度O(1)
四、归并排序
多次将两个或两个以上的有序表合成一个新的有序表。通常采用二路归并排序。
已知关键字序列{75,68,87,92,88,61,80,72}
平均时间复杂度O(nlogn)
空间复杂度O(n)
五、基数排序
有两种基数排序:最低位优先LSD,最高位优先MSD
先按照最低(高)位的值进行记录排序,在此基础上按次低(高)位进行,直到全部位数完成。
已知关键字序列{757,648,387,292,488,761,280,72}
时间复杂度O(d(n+r)) d为分配的趟数,r为基数 分配为O(n) 收集为O(r)
空间复杂度O(r)