排序算法核心思想总结
emmm 写的比较简单,不适合新手看。适合已经手写过一遍的人复习用。
冒泡排序
核心思想
- 两个循环让最小的数一直往上移动
- 最小的,第二小的。。。循环到最后就已经排好序了
选择排序
核心思想
- 找出数组中最小的一个数
- 与数组中第一个交换
- 以此类推,找第二个。。。循环到整个数组结束
插入排序
核心思想
- 把数组看做左右两份。左边是有序的,右边是无序的。
- 从左向右遍历右数组(一开始左数组长度为1,右数组长度为N-1),如果右数组的第一个数小于左数组的最后一个数(从小到大排序),则说明需要把这个数插入到左数组的相应位置中。左数组的部分值需要右移。
- 这样一次操作以后左数组长度++,右数组长度–
- 循环操作直到整个数组变成左数组
希尔排序(插入排序的优化版)
核心思想
- 假设数组长度为N,引入一个间隔因数M。则数组可以被分作N/M份(假设数组为[1,2,3,4]。N=4,设M=2。则数组可以被分作两份:[1,3],[2,4];并不是[1,2]和[3,4]])
- 对于被分割之后的数组A(1),A(2)…A(N/M)分别进行插入排序
- 逐渐缩小M 直到M<1,结束排序(希尔排序的正确性保障,就是当M=1时,相当于对全数组来了一次插入排序)
归并排序
核心思想
对于多个有序数组,将它们合并成一个有序数组
对于无序数组使用归并排序:
- 将一个无序数组分解成多个无序的数组(递归)
- 由于递归到最后,最小粒度是1, 则能保证在递归拆分过程中每一个间隔为1的数组是有序的。
- 递归回溯的时候,会进行粒度大于1的数组排序。假设粒度为2,此时把数组看做两份, 由3可知这两份独立起来看都是有序数组,把这两份数组归并成一份有序数组
- 一直回溯
快速排序
核心思想
- 将原来的无序数组看做左右两份
- 选中一个基准值(往往是n[0],要求左数组的所有值比n[0]小,右数组的所有值都比n[0]大)。此时左右数组都可能是无序数组
- 递归调用,拆分左右数组,直到数组粒度足够小(往往是1)
桶排序
核心思想
- 初始化10个队列
- 取每个数的个位。0就放0号队列,1就放1号队列。。。
- 按照012…的队列顺序从10个队列中取出数据(因为要先入先出,所以是队列)
- 接着取每个数的百位。0就放0号队列,1就放1号队列。。。
- 步骤3
- 。。。直到循环到所有数都在0号队列 说明已经到了最大了 。按照FIFO的顺序取出来,就是已经排好序的数组了
堆排序
核心思想
大顶堆概念:根节点比子节点都要大的二叉树
顺序存储二叉树:一种可以用数组来表示的二叉树。所有对二叉树的操作,本质上都是在对于数组进行操作
- 构建大顶堆
- 把二叉树的根节点与最后一个节点交换位置
- 除去第一个树,继续构建大顶堆
- 。。。。重复步骤 直到树中剩下最后一个值
- 由于使用顺序存储二叉树,所以结果就是一个数组。无序遍历二叉树得到最后结果