排序根据不同角度可以分为很多类
稳定排序:
能够使任何数值相等的元素,排序以后相对次序不变
非稳定排序:
不是稳定排序的方法
1.插入排序:
在有序序列中插入一个元素,保持序列有序(数组前半段为有序段,后半段为插入待插入无序段)
根据插入位置方法的选择分为:
1)直接插入排序:
顺序法定位插入位置,适用于输入数据基本有序的情况,属于自然排序,具有稳定性。插入排序是移动,不是交换!
2)二分插入排序:
二分法定位插入位置。和直接插入排序相比,减少了元素的比较次数但是元素的移动次数并未改变(因为左半段是有序段,所以可以用二分查找)
3)希尔排序:
缩小增量多遍插入排序。相比直接插入排序的比较一次移动一步改进为比较一次移动一大步(这个一大步就增量序列,增量序列必须满足递减且最后一个为1的原则),通过缩小增量多遍插入排序,提高插入效率。把每个增量排序后的结果竖着写下来就是本次增量排序后的结果即每一组最小的数排在一起
2.交换排序
通过比较相邻元素的大小,出现逆序则交换位子,最后没有逆序出现了则是要求的序列
1)冒泡排序:(具有稳定性)
反复扫描待排序列,若相邻元素构成逆序,则交换它们,直至无逆序产生
每一遍扫描都可以使得最小元素上浮,所以每次扫描后整个数据可以分为上面的有序段,和下面的无序段
冒泡排序改进的思想:可以如果一遍比较都没有发送逆序,说明此时整个数据段都是有序的了,此时可以提前结束排序
2)快速排序(划分交换排序):(非稳定性的)
冒泡排序只能相邻元素比较交换,所以总的比较次数和移动次数较多。改进的方法是:将数据分组,组内无序,组间有序
3.选择排序
从n个元素中选择一个最大(小)元素,把它调到序列末(前)端,再从剩下的n-1的元素中选出最大(小)元素...反复如此,直到只剩下1一个元素时,就可完成排序。根据不同选择最大(小)元素的方法的不同分为,简单选择排序和堆排序
1)简单选择排序(非稳定性的)
2)堆排序(非稳定性):
堆排序是解决简单选择排序冗余比较的问题,提高了排序的效率
堆的定义:
堆是每个非叶节点值都大于或等于其儿子值(父大于子)的完全二叉树。所有堆的本质是棵完全二叉树。根节点存储的就是树中的最大值,这样的定义堆称为大根堆。大根堆便于找最大元。
重新堆化(利用左右子堆合并原理)和初始堆化()太难了,我不学了,后面工作需要的时候再说把。堆的树形结构记录了堆的大小关系,减少了元素之间的比较,所以提高了比较的效率
评价情况下:快速排序还是最快的排序
-----------------------------------------------------------
以下俩个排序感觉有点难,不学了。需要的时候再学习
4.合并排序(归并排序)
1)2-路归并
将俩个或俩个有序表合并成一个新的有序表,直至所有元素都合并完为止(和快速排序分组的思想相反,这里是合并的思想)
5.基数排序(桶排序)