排序算法
1.归并排序
1.将多个有序表多次合成,是之成为一个有序表的过程
2.两两归并,直到合成一个完整的有序表
3.代码实现
4.时间复杂度O( n l o g 2 n nlog_{2}n nlog2n),空间复杂度O(n).
2.基数排序
1.确定基数r,二进制则基数是2,十进制则基数是十。
2.基数排序两种方法:最低为优先(LSD)和最高位优先(MSD)。
3.操作过程总结起来就是分配和收集。具体过程(LSD):1.创建r个队列,f代表队头,r代表队尾,并且每个队列分别代表0r-1,表头和表尾记录0r-1;2.分配,第一次分配从最低位开始,根据该位的数字将关键字放入队列中;收集,所有关键字都分配完毕,将队列从大到小或从小到大首尾依次相连。3.每一位都这样操作。
4.时间复杂度O(d(n+r));空间复杂度O®。
3.选择排序
1.简单选择排序(直接选择排序)
2.堆排序
简单选择排序(直接选择排序)
1.它和冒泡法还是有区别的。冒泡法属于是交换排序,它的位置交换的次数比简单选择排序要多很多。
2.时间复杂度O( n 2 n^2 n2);空间复杂度O(1)。
堆排序
1.堆分为大根堆和小根堆:根结点关键字大于孩子则是大根堆,小于孩子则是小根堆。先综述一下堆排序如何实现排序。(大根堆为例),因为构造好了大根堆,那么根节点一定是最大的,我们把根节点移到最后,再将最后的提前,然后筛选继续构造堆。
2.无论大根堆还是小根堆都是在隐形的,结点中并没有指针来指向孩子结点,而是利用函数来确定某节点的左右孩子结点,而这个函数就是:某节点的序号是i,则他的孩子结点的序号分别是2i和2i+1。
3.所以,据前面可知,利用堆排序,最主要是构建出大根堆或是小根堆。这里将构造堆的算法叫做筛选(sift) 好像筛子一样将小的节点筛下去。
4.时间复杂度O( n l o g 2 n nlog_{2}n nlog2n),空间复杂度是O(1)。且不稳定
5.不稳定的意思是:在排序的过程中,关键字完全相同的节点的相对位置会改变。
4.交换排序
1.冒泡法
2.快速排序
冒泡法
1.从尾开始两两比较比较到有序区的尾。
2.改进的冒泡法:设置一个变量exchange,bool型,一旦某一趟完全没出现交换操作,就可以提前结束排序。
3.最坏时间复杂度O( n 2 n^{2} n2)(反序时),最好的时间复杂度O(n)。
快速排序
1.选定开头的关键字作为基准,将大于它的放在他的后面,小于它的放在前面。
2.最好的时间复杂度O( n 2 n^{2} n2)最坏O( n l o g 2 n nlog_{2}n nlog2n).空间复杂度最坏O(n),最好O( l o g 2 n log_{2}n log2n).
5.插入排序
1.直接插入排序
2.折半插入排序
3.希尔排序
####直接插入排序
1.将序列分为有序区和无序区。每次将无序区最前面的元素挨个和有序区元素作比较(从后往前),直至合适的位置。
2.时间复杂度:最好O(n);最坏O( n 2 n^{2} n2).
折半插入排序
1.在有序区采用折半查找法,找到待加入的元素的合适的位置。
2.时间复杂度o( n 2 n^{2} n2).(查找的时间变短了但是移动的次数不变)。
希尔排序
1.分组,组内排序,结束标志是组数为1.
2.时间复杂度o( n 1.3 n^{1.3} n1.3).