排序虽然学过,也用自己的代码去实践了,但是 一不用就会忘记,现在已经忘记的差不多了,需要温故而知新一下
排序:
简单的:
1.插入排序
将之前的队列看成是有序的,然后将当前的数,插入到之前的有序序列合适的位置上
如 1,2,8, (待插入)5,8,6 -------> 将待插入的5 应该放到 8之前,8往后移
2.冒泡排序
冒泡真的跟冒泡泡一样,只不过每次只冒一个泡泡,就是每次可以出现一个最大值,
冒泡就是,比较当前 左右两个数 谁大,如果前的大,就前后交换,这样一趟下来,最后一个数一定是最大的,这就是那个泡泡
如 6,8,7 ------------》 8比7 大 交换 8,7 变成 7,8, 那8是不是冒出来了
3.希尔排序
发明人叫希尔,所以叫希尔排序,希尔是对插入的改进,他是相当于 有组的概念,取某个间隔(你可以随意去),然后让 间隔 的数 作为一组, 对组内进行排序。
如 我要选间隔为 2
3,4,6,1,7 --------》 组一: 3,1 ,组二 : 4,7 ,组三 : 6 (什么 只有一个,没关系,数组越少,我都不用排序了)
然后对组内进行排序: 抱歉,只有组1 是乱序, 将组一排序 3,1----》 1,3
如果我在减少间隔 为1
是不是 这些数都是一组了,就是简单插入排序了, 但是分组的作用还是很关键,可以更多的减少逆序(就是 8,7 大数8,在7的前面,不是我们想要的结果),经过 其他间隔的调整,在进行间隔为1的时候,那就交换 的操作就会少很多,这就是希尔对简单插入的改进之处
好玩的:
快速排序(没听过把,慌不慌? 快速的来源是因为 他被发明时,比起他的对手,简直太快了,他的对手忘记了。。)
快速排序,其中有一种思想很屌,那就是拆分,每次可以确定一个数的最终位置
随便 你选一个数,作为分界值(可以选头头的那个位置的值),将数组 按照 你选出来的值,小于他的 放在前面,大于他的放在他的后面,
例如: 3,5,6,7,9,7, 我选3 作为分界线的值,煞笔吧 那还用排什么,比他大的不都在右边了么,换一个,我选7
那 按照这个分界线 ,结果变成 --------> 3,5,6,7,7,9 这样 小于7的都在左边,大于7的都在右边,这样可以确定出一个7的最总位置
编码实现这样的 分界线 方法有: 挖坑法,指针法
已7 为界,可以分为 左边屁股,和右边屁股, 再把左边,跟上述一样,在进行 找个分界线,排序,右边同理
所以快速好玩在,可以分 ,每次分两办 2^n = 总数 想要知道 分了多少次 n = long2(总数);当然也踏实不稳定的,可能在交换的时候被交换了,也可能存在最坏的情况 n^n ,每次只能确定一个 数的位置
归并排序:
这个呢,也同样跟快速类似,将 数组 分成两半,直到数组的长度为1, 然后在合并两个数组,让他们称为一个有序的数组,
如 {2},{1} --> 合并 {1,2}; 拆的过程 {1,2,4,6} --》{1,2},{4,,6}--》{1},{2},{4},{6}
在进行合并,时间复杂度 固定 nlong2(n);
具体分类 可以参考 者篇博客()十大经典排序