排序算法
seeyoutlb
这个作者很懒,什么都没留下…
展开
-
10种常见排序算法-理解附代码
文章目录一、时间复杂度与空间复杂度二、排序算法1.选择排序2.冒泡排序3.*插入排序4.*堆排序5.希尔排序6.*归并排序7.*快速排序8.桶排序9.计数排序10.基数排序整理自:马士兵数据结构与算法一、时间复杂度与空间复杂度【理解】时间复杂度:空间复杂度:10种常见的排序算法:最好能背下来主要三要素:平均复杂度、空间复杂度、稳定性重要4种:插入排序、堆排序、归并排序、快速排序【排序算法分类】:如何理解排序不稳定?稳定性指的是对于关键字相等的两个记录,他们在序列中的相对位置在排序前原创 2022-03-19 10:04:03 · 1195 阅读 · 0 评论 -
10种排序算法 八:基数排序 - 稳定
基数排序 - 稳定/** * 排序算法 八:基数排序 * 【思想】计算数组最大数求出最大位数(决定外层循环次数),计算个位数并对个位数的放在一个桶,对其进行排序,累加位置(记录了相同数的最大位置), * 再对十位、百位.....进行排序,对累加数组进行拆解(累减),存放在新数组中。 * 时间复杂度:n+k * 空间复杂度:n+k */public class RadixSort { public static void main(String[] args) {原创 2022-03-18 22:57:24 · 248 阅读 · 0 评论 -
10种排序算法七:计数排序 - 稳定
计数排序/** * 排序算法:计数排序-桶排序的一种 * 【思想】指定计数长度数组大小(与原数组的值的范围相关),遍历原数组,取原数组的值对应计数数组的下标相比,每出现1次,在计数数组下标位置的值加1,。 * 定义新的数组,将计数数组下标与对应出现的次数依次写入到新数组中 * 时间复杂度:n+k * 空间复杂度:n+k */public class CountingSort { public static void main(String[] args) { in原创 2022-03-18 22:49:05 · 178 阅读 · 0 评论 -
10种排序算法六:快速排序 - 不稳定
快速排序/** * 排序算法六:快速排序 - 不稳定 * 【思想】数组中随机取一个元素与最后一个元素进行交换,并设置为初始轴。 * 定义左右边界,同时向中间移动,直到左边的值小于左边轴值,并且右边的值大于轴值,此时将两个数进行交换,再将轴值与最左边的值位置进行交换,并返回轴下标。 * 以新轴下标为分界点,分别向左向右进行递归。 * 时间复杂度:n*logN * 空间复杂度:logN */public class QuickSort { public static void m原创 2022-03-18 22:40:06 · 218 阅读 · 0 评论 -
10种排序算法五:归并排序 - 稳定
归并排序/** * 排序算法五:归并排序 - 稳定 * 【思想】:开辟一个新数组,将原数组进行多次对半分,每次都有leftBound(左边界),right(下标位置),rightBound(右边界),直到不可再分为止(递归终止条件),然后对每小段数组进行合并并把值写到新数组。递归再将数组二分进行排序。 * 与快排相比,归并排序是通过下标进行操作; * 【空间复杂度】n * 【时间复杂度】n*logN */public class MergeSort { public static原创 2022-03-18 22:34:50 · 186 阅读 · 0 评论 -
10种排序算法四:希尔排序 - 不稳定
希尔排序/** * 排序算法四:希尔排序:插入排序第二种实现方式的升级版 * 【思想】计算数组间隔,取每个间隔上的数作为一个数组,进行排序,再对每个间隔上+n的数进行排序,最后缩小间隔至1排序 * 时间复杂度:n^1.3 * 空间复杂度:1 * 【最佳间隔】h=3*h+1 * */public class ShellSort { public static void main(String[] args) { int[] arr = {9, 6, 11, 3,原创 2022-03-18 22:23:43 · 269 阅读 · 0 评论 -
10种排序算法三:插入排序 - 稳定
插入排序/** * 排序算法三:插入排序 * 【思想】通过临时变量,当前临时变量位置与前一个数进行比较,如果前一个数大于临时变量,那么直接将前一个位置向后移位1次,并且记录移动的次数作为最终临时变量值的下标。 * <p> * 时间复杂度:n^2 * 空间复杂度:1 */public class InsertionSort { public static void main(String[] args) { int[] arr = {5, 1, 44,原创 2022-03-18 20:57:52 · 139 阅读 · 0 评论 -
10种排序算法二:冒泡排序 - 稳定
冒泡排序/** * 排序算法二:冒泡排序 * 【思想】相邻两个数做比较,最大(最小)数的往后移 * 时间复杂度:n^2 * 空间复杂度:1 * 【扩展】复杂度为n的冒泡排序:当整个数组是有序的时候 可以实现 */public class BubbleSort { public static void main(String[] args) { int[] arr = {55, 4, 7, 88, 15, 3}; sort(arr);原创 2022-03-18 17:31:30 · 153 阅读 · 0 评论 -
排序算法:对数器(验证算法正确性)
对数器:验证算法正确性/** * 排序算法:对数器(验证算法的正确性) * 时间复杂度:n*log N * 空间复杂度:log N * */public class SortLogarithmicDetector { private static final int DEFAULT_ARR_LENGTH = 3000; private static final int RANDOM_BOUND = 5000; public static void main(S原创 2022-03-18 17:19:02 · 279 阅读 · 0 评论 -
排序算法:算法稳定性
从代码层面理解:算法的不稳定性/** * 测试算法不稳定性问题:以选择排序为例子 */public class TestSelectSortStable { /** * 以简单选择排序验证算法稳定性 * * @param args */ public static void main(String[] args) { Student[] arr = {new Student("java", 22),原创 2022-03-18 17:12:08 · 323 阅读 · 0 评论 -
10种排序算法一:选择排序 - 不稳定
选择排序/** * 排序算法 一:选择排序 * 【思想】找到数组中最小的值,与组数最前或最后一值做交换 * 时间复杂度:n^2 * 空间复杂度:n * 【扩展】找到数组中最大和最小值,最小值与最前值做交换,最大与最后值做交换。 * 时间复杂度: n*logn * 空间复杂度:n */public class SelectionSort { public static void main(String[] args) { int[] arr = {55, 1, 7原创 2022-03-18 17:00:13 · 169 阅读 · 0 评论