堆排序
原则:升序使用大顶堆 ,降序使用小顶堆
以升序为例,原理:
- 首先按照数组的顺序创造一颗二叉树
- 从最后一个非叶子节点看起,(最后一个非叶子节点就(arr,length-1)/2)
- 如果该节点小于其中的子节点 就交换顺序 一直这样搞
- 这个二叉树就成为了一个大顶堆 这个时候 根节点(数组的第一个元素)就是最大的
- 交换数组的首位元素
- 这时候只考虑数组的长度-1的情况 因为最后一个是最大的 排好了xu就不用管
- 继续上面的操作 第二大数字就放在了数组头部 交换数组第一个和倒数第二个的元素
- …
- 这样持续下去,数组就 排好序了
比如上面的树,经过第一轮的调整,9就会成为根节点!依次类推…
基数排序
基排序的原理:
- 先根据个位数,将数字放入到0~9的盒子里面(比如12 放到2号盒子)
- 然后按照从左到右,先放进去的先取出来 这种方法再次排成一个序列(先取1号盒子 再取2号盒子…)
- 接着根据十位数 继续以上的操作 直至根据到最大的位数 此时就排好序了
归并排序
首先讲一下什么是归并:
比如 3,8,2,4,1,5,4,6
分割:3,8,2,4||1,5,4,6
但是分割的还是不够小啊
继续分割:3,8||2,4 ||| 1,5||4,6
还是不够小 3|8 || 2|4 ||| 1|5 || 4|6
1.数组【3】和【8】,归并结果为【3,8】 2、数组【2】和【4】,归并结果为【2,4】 右边的部分也一样
然后归并后的【3,8】和归并后的【2,4】再次进行归并操作 结果为【2,3,4,8】
至此左边排好序了 右边同理 结果为【1,4,5,6】
然后左边和右边进行最后的归并
最终结果为:【1,2,3,4,4,5,6,8】
快速排序
快速排序原理:
- 比如: 【2,4,1,3,5】
- 先定位光标【2!,4,1,3,5!】(!代表光标)
*先把第一个数字取出来 作为标准stard=2 - 最后一个数字比标准大 光标前移
- 【2!,4,1,3!,5】
- 依旧是这样的,所以继续前移【2!,4,1!,3,5】
- 发现此时后光标对应的数字比标准小 则用后光标对应的数字覆盖前光标【1!,4,1!,3,5】
- 此时我们只需要看前光标,嗯前光标比标准小 前光标后移【1,4!,1!,3,5】
- 此时前光标比标准大 用前光标对应的数字覆盖后光标【1,4!,4!,3,5】
- 此时应该看后光标了 后光标比目标大 后光标前移【1,4!!,4,3,5】
- 此时两个光标重合:我们就用标准代替这个重合的元素【1,2,4,3,5】
- 至此第一轮排序完结!!!!!!!!!!
- 接着把1当成标准 再次这样操作 经过反复操作 数组最后就会排好序
插入排序
原理:比如一个数组:2! 1 6 0
看第一个数字
只要前面没有数字比此数字大,就向看下一个
2 1! 6 0
如果前面有数字比它大,就要进行调整,前后相邻的交换顺序,使他符合要求
1 2 6 0
看第3个数字…
看第4个数字
调整为0 1 2 6
希尔排序
插入排序的优化
不断的除以2确认步长
比如说上面的:步长为9/2=4
然后按照步长,对相同步长的数字进行插入排序
第一组2 1 0 排好后是 0 1 2
第二组是5 8
…
排好后,步长再除以2
继续操作,直到步长为1
选择排序
选择排序原理:
大致思想是这样的:
第一轮:通过循环比较,找到值最小的数的下标,与数组 第一个数字进行交换
第二轮比较,就不用看第一个数字了,循环找到后面最小的数字下标,跟数组第二个数字进行交换…
…
就这样搞下去,数组就会被排好序!
冒泡排序
原理:
n个数字的数组就比较n轮
第一轮的循环中,只要发现后面有数字比数组中第1个数字小,就交换顺序,所以经过了第一轮后,数组第一个数字为最小值
第二轮就不看第一个数字了,从第二个数字开始循环比较
…
最终数组就排好序了