Zhoujie Blog

十大排序算法(十), 基数排序

算法图解 将数切割成个位, 十位, 百位, 千位… 按位放置进入长度为10的数组 先进先出规则回填入数组 重复1~3,直到所有位数都比较完毕 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 4...

十大排序算法(九), 桶排序

算法图示 元素分配到桶中 对桶中的元素进行排序 設置一個定量的陣列當作空桶子。 尋訪序列,並且把項目一個一個放到對應的桶子去。 對每個不是空的桶子進行排序。 從不是空的桶子裡把項目再放回原來的序列中。 如果桶足够小就变成了计数排序, 计数排序是桶排序的一个特例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1...

十大排序算法(八), 计数排序

简介 用来排序0~100数字最好的算法, 可以在基数排序中更有效的排序范围较大的数组 算法实现 思路图示 具体步骤 最大/小值: 找出Arr(待排序的数组)中最大(max)和最小(min)的元素; 创建计数数组C, 长度是 K (K = max - min + 1) 计数: 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 累加 C中数据进行累加(c...

十大排序算法(七), 归并排序

算法图解 典型的分治法, 分是把排序问题分解到最小单位(即: 1个数排序), 治把子树的排序结果向上合成上一层级父亲的排序结果, 下图描述的是治的过程 先递归对序列进行分解成最小单元 逐级计算治的结果 实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29...

十大排序算法(六), 堆排序

须知须会 数据结构-堆 分为最大堆和最小堆 最大堆, 父节点的值大于子节点 最小堆, 父节点的值小于子节点 本文采用最大堆解决问题 父子节点的对应索引关系推导 假定我们拿到这样一个数组, 并且把它表示成以下的树结构 设: P 是父节点对应数组的索引 C 是左子节点对应数组的索引 i 是子节点所在二叉树的层次 j 是子节点所在层次的偏移量 ...

十大排序算法(四), 希尔排序

算法图解 选择 一个最大/小的数, 排到最前面 假设数组长度为 n i = 0 , 遍历 [i,n] 个数字, 选择 一个最小的, 和 i 交换 i + 1 重复 1 2 步骤, 直到 i == n 实现 1 2 3 4 5 6 7 8 9 10 int n = array.length; int curMin; ...

十大排序算法(四), 希尔排序

简介 插入排序的优化, 也叫缩小增量排序 算法思路 分组排序 步长, 同组中2个元素在数组中的间隔数 定义分组的步长, step = arrLength / 2 对每个分组进行插入排序 step = step / 2 重复 1~2 直到 step <= 0 (step == 1, 是最后一次分组) 第一次分组, step = 4 第一次分组,...

十大排序算法(三), 插入排序

算法图解 插入 第 i(范围0~length)个数,到有序队列的合适位置 假设数组长度 n , i(代表有序数组的长度) = 0 取第 i+1 个数, 插入到长度 i 有序数组的合适位置 i+1 重复 1~2, 直到 i = n 实现 1 2 3 4 5 6 7 8 9 10 11 12 int n = array.length; ...

十大排序算法(二), 快速排序

算法图解 冒泡排序 的优化 分治的思想, 随机找到第一个数字 6, 将比6小的挪到6左边, 比6大的挪到6右边, 分成两堆 递归6的左边和右边 重复1~2直到分解成最小单元(左右两边只有1个/0个元素) 如何实现 将比6小的挪到6左边, 比6大的挪到6右边 , 参考 1.挖坑法 2.双指针法, 本文采用挖坑法实现 挖坑法 && 双指针法讲...

十大排序算法(一),冒泡排序

图解思路 最大/小的数 冒泡 到最后面 假设数组长度 n 比较相邻2位, 大的数交换到右边, 直到第 n 个数也完成交换 n 减一 (第1步使得最大的数冒泡到了最右边) 继续 1~2, 直到 n = 1 实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // n 轮 for (int i = le...