![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
图解十种排序算法
图解经典的十种排序算法,时间复杂度/空间复杂度/稳定性讲解,代码java实现,配有动图理解。
锥栗
这个作者很懒,什么都没留下…
展开
-
【经典排序算法】10. 基数排序
基数排序又是桶排序的改进,基数排序根据每个位数只包含10个数,开辟10个桶,通过对位数低到高地计数数组元素每个位数的数值(类似于计数排序),划分到对应桶中完成排序。对于十进制整数来说,基数排序是非常高效的。public class Main { public static void main(String[] args) { int[] arr = {31, 5, 6, 2, 10, 17, 41}; System.out.print("排序前:");原创 2021-03-12 10:02:10 · 254 阅读 · 0 评论 -
【经典排序算法】9. 桶排序
桶排序,将待排序数据平均切分为几个区间(不同的区间之间本身就是有序的),叫做桶,每个桶各自将元素排序好,再将桶内数据合并即可完成排序。桶排序必须将数据均匀分布在桶中,如果数据全在一个桶中,排序会退化为桶内的排序类型。计数排序可以看做是一种极端的桶排序,一个数就对应一个桶,一个桶只存放一个具体的数(而不是一个区间的数)。import java.util.Collections;import java.util.ArrayList;public class Main { public stat原创 2021-03-07 16:11:21 · 240 阅读 · 2 评论 -
【经典排序算法】8. 计数排序
之前的排序都是基于比较的排序。计数排序,包括后面桶排序和基数排序则不是。计数排序,顾名思义,记录元素的出现次数来排序。指定一个新数组,数组索引用来记录存储的元素,数组数字记录出现元素的次数。该排序适用于序列分布比较集中的情况,并且边界已知且比较小,并且排序的元素必须是整数。如果序列分布过于稀疏,边界太大,则开辟新数组的空间占用会很大。...原创 2021-03-05 10:24:18 · 160 阅读 · 5 评论 -
【经典排序算法】07. 堆排序
堆排序是利用最大堆性质和维护最大堆的操作来进行的排序。还记得堆的一些性质:堆的索引与数组索引具有特定对应的关系如果堆是以 1 为起始结点索引的话,数组索引从左到右0,1,2…,对应堆中每个节点的索引顺序,就是对二叉堆层序遍历每个结点的顺序。对于二叉堆的某个结点索引iii来说,iii的父结点索引为 i/2,iii的左子结点索引为 i*2 ,那iii的右子结点索引就是 i*2+1(左子节点索引+1)。但如果堆是以 0 为起始结点索引的话,数组索引从左到右0,1,2…,对于二叉堆的某个结点索引iii来说原创 2021-03-01 17:39:42 · 341 阅读 · 9 评论 -
【经典排序算法】6. 快速排序
快速排序是冒泡排序的一种改进版本。快速排序虽然最坏情况的时间复杂度是O(n²)(给顺序数组排列,将退化为冒泡排序),但是其性能在顺序性越差的数据中表现越好,甚至可以比归并排序要好。快速排序跟归并排序的平均时间复杂度都是O(nlogn),但是快速排序的O(nlogn) 记号中隐含的常数因子很小,所以其常常在顺序性差的数据中要快于归并排序。代码如下:...原创 2021-02-19 17:10:01 · 314 阅读 · 0 评论 -
【经典排序算法】5. 归并排序
public class Main { public static void main(String[] args) { int[] arr = {3, 3, 5, 6, 2, 1, 9, 7}; System.out.print("排序前:"); arrPrint(arr); MergeSort(arr); System.out.print("排序后:"); arrPrint(arr); }原创 2021-02-17 20:58:12 · 243 阅读 · 0 评论 -
【经典排序算法】4. 希尔排序
希尔排序是插入排序的一种改进版本。代码如下:public class Main { public static void main(String[] args) { int[] arr = {3, 3, 5, 6, 2, 1}; System.out.print("排序前:"); arrPrint(arr); ShellSort(arr); System.out.print("排序后:"); arr原创 2021-02-16 21:39:59 · 488 阅读 · 2 评论 -
【经典排序算法】3. 插入排序
代码如下:public class Main { public static void main(String[] args) { int[] arr = {3, 3, 5, 6, 2, 1}; arrPrint(arr); InsertSort(arr); arrPrint(arr); } // 插入排序 // 该算法将遍历数arr[i]之前所有比arr[i]大的数整体右移,腾出的位置放置arr[i]。原创 2021-02-14 21:39:15 · 134 阅读 · 0 评论 -
【经典排序算法】2. 选择排序
代码如下:public class Main { public static void main(String[] args) { int[] arr = {3, 3, 5, 6, 2, 1}; arrPrint(arr); SelectSort(arr); arrPrint(arr); } // 选择排序算法 // i从头遍历至倒数第二位,当前遍历位i需要替换为最小值, // 我们在i之后使指针j原创 2021-02-14 16:40:53 · 228 阅读 · 5 评论 -
【经典排序算法】1. 冒泡排序
public class Main { // 实例演示 public static void main(String[] args) { int[] arr = {3, 5, 6, 2, 1}; arrPrint(arr); BubbleSort(arr); arrPrint(arr); } // 冒泡排序算法 // i从arr的尾端遍历至首端 // j则从头遍历至i,这样j的遍历范围会随着j的一轮for(i)原创 2021-02-13 11:16:20 · 201 阅读 · 0 评论 -
【经典排序算法】总集
十个经典排序算法特性对比:注:稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。(in-place)原地排序:在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换。(out-place)非原地排序:需要利用额外的数组来辅助排序。...原创 2021-02-12 20:25:17 · 121 阅读 · 0 评论