了解你使用的 Sort ( 实现剖析) - 3
先上图, 本篇文章涉及 归并排序 和 基数排序 两种算法 往期: 了解你使用的 Sort ( 实现剖析) - 1 中,介绍了 **插入排序** 和 **交换排序** 中四种排序算法 了解你使用的 Sort ( 实现剖析) - 2 中,介绍了 **选择排序** 中两种算法 归并排序归并排序使用分治法,核心在于数列的“分”与“合”,不断地将两个已排好序的数组合并一个有序数组 思路: 将数组分割为两个部分,创建新的数组a1和 b1 如果a1的长度大于2,则继续执行1过程,直至ai 将ai中两个数字进行比较交换位置形成有效数组 递归向上比较两个数组大小并合并成新的有序数组 (例如比较数组第一位,即可得出哪个数组更小) 参考动画去理解 ↓ 基数排序前置条件: 必须为整数数组,或者你可以转化为整数数组 知道数组的位数范围(比如 0 - 999...
了解你使用的 Sort ( 实现剖析) - 2
先上图, 本篇文章涉及 选择排序 中两种算法 往期: 了解你使用的 Sort ( 实现剖析) - 1中,介绍了 **插入排序** 和 **交换排序** 中四种排序算法 直接选择思路: 遍历数组a[0]-a[n]并得出最小值a[j], 将a[0]与a[j]互换 遍历数组a[1]-a[n]并得出最小值a[j], 将a[1]与a[j]互换 循环直至结束 参考动画去理解 ↓ 堆排序核心:将数组构造成二叉堆↓(左侧数组,右侧对应二叉堆) 二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。 思路: 构建二叉堆...
了解你使用的 Sort ( 实现剖析) - 1
先上图, 本篇文章涉及 插入排序 和 交换排序 基础插入排序思路: 将数组分为已完成排序部分和未完成排序部分,总是左侧为已完成部分 首先第 0 位归为已完成排序部分 将未完成排序部分中最左侧的数字依次与已完成排序部分的进行比较,如果左侧数字更大,则交换两那个数字,直至没有交换,至此已完成排序部分多一位 重复第三步操作直至未完成排序部分清空 参考动画去理解,小方块都绿是每个循环的结束 ↓ Shell 排序 (希尔排序)由于基础插入排序每次都是一个挨着一个数字比较,希尔排序是对数字移动次数减少的一个改进算法。 定义一个正整数 d1 (可以理解为步数) 从第 0 位至 arr.length-d1 位遍历,将当前位 i 与 i+d1 为进行比较,如果第 i 位数大于 第 i+d1 位,则进行交换 再定义一个正整数 d2 (d2 < d1) 执行同2步骤 重复上述操作直至取 di=1,即对整个数组进行一次插入排序 可以理解为为了大概率减少数字间的交换,设计的一种增量逐步减少式的插入排序 一般 d1 选择...