数据结构篇——常见排序算法核心思想简单梳理

排序算法核心思想总结

emmm 写的比较简单,不适合新手看。适合已经手写过一遍的人复习用。

冒泡排序

核心思想

  1. 两个循环让最小的数一直往上移动
  2. 最小的,第二小的。。。循环到最后就已经排好序了

选择排序

核心思想

  1. 找出数组中最小的一个数
  2. 与数组中第一个交换
  3. 以此类推,找第二个。。。循环到整个数组结束

插入排序

核心思想

  1. 把数组看做左右两份。左边是有序的,右边是无序的。
  2. 从左向右遍历右数组(一开始左数组长度为1,右数组长度为N-1),如果右数组的第一个数小于左数组的最后一个数(从小到大排序),则说明需要把这个数插入到左数组的相应位置中。左数组的部分值需要右移。
  3. 这样一次操作以后左数组长度++,右数组长度–
  4. 循环操作直到整个数组变成左数组

希尔排序(插入排序的优化版)

核心思想

  1. 假设数组长度为N,引入一个间隔因数M。则数组可以被分作N/M份(假设数组为[1,2,3,4]。N=4,设M=2。则数组可以被分作两份:[1,3],[2,4];并不是[1,2]和[3,4]]
  2. 对于被分割之后的数组A(1),A(2)…A(N/M)分别进行插入排序
  3. 逐渐缩小M 直到M<1,结束排序(希尔排序的正确性保障,就是当M=1时,相当于对全数组来了一次插入排序)

归并排序

核心思想

对于多个有序数组,将它们合并成一个有序数组

对于无序数组使用归并排序:

  1. 将一个无序数组分解成多个无序的数组(递归)
  2. 由于递归到最后,最小粒度是1, 则能保证在递归拆分过程中每一个间隔为1的数组是有序的。
  3. 递归回溯的时候,会进行粒度大于1的数组排序。假设粒度为2,此时把数组看做两份, 由3可知这两份独立起来看都是有序数组,把这两份数组归并成一份有序数组
  4. 一直回溯

快速排序

核心思想

  1. 将原来的无序数组看做左右两份
  2. 选中一个基准值(往往是n[0],要求左数组的所有值比n[0]小,右数组的所有值都比n[0]大)。此时左右数组都可能是无序数组
  3. 递归调用,拆分左右数组,直到数组粒度足够小(往往是1)

桶排序

核心思想

  1. 初始化10个队列
  2. 取每个数的个位。0就放0号队列,1就放1号队列。。。
  3. 按照012…的队列顺序从10个队列中取出数据(因为要先入先出,所以是队列)
  4. 接着取每个数的百位。0就放0号队列,1就放1号队列。。。
  5. 步骤3
  6. 。。。直到循环到所有数都在0号队列 说明已经到了最大了 。按照FIFO的顺序取出来,就是已经排好序的数组了

堆排序

核心思想

大顶堆概念:根节点比子节点都要大的二叉树
顺序存储二叉树:一种可以用数组来表示的二叉树。所有对二叉树的操作,本质上都是在对于数组进行操作

  1. 构建大顶堆
  2. 把二叉树的根节点与最后一个节点交换位置
  3. 除去第一个树,继续构建大顶堆
  4. 。。。。重复步骤 直到树中剩下最后一个值
  5. 由于使用顺序存储二叉树,所以结果就是一个数组。无序遍历二叉树得到最后结果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章