【LeetCode刷题篇零】一些基础算法知识和前置技能(上)

本文介绍了排序算法的基础知识,包括冒泡、选择、插入、希尔排序、快速排序和归并排序,分析了它们的时间复杂度和稳定性。此外,还讲解了查找算法如二分查找和哈希查找,以及Java内置的排序和查找方法。最后,讨论了不同排序算法的选择策略,如在LeetCode刷题中如何选择合适的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序算法

O(N^2)的排序算法:冒泡、选择、插入

冒泡排序

在这里插入图片描述

冒泡的核心是两两比较,大数下沉,小数上浮,比较的轮数是数组的长度 N,每一轮比较的次数为 N - 当前轮的索引:

  • 外层循环控制轮数 round: [1,N]
  • 内层循环控制次数 i: [0,N - round)

在每一轮当中,内循环中两两比较相邻的两个数,大数下沉(交换),如果某一轮没有发生交换操作,则可以提前终止。

代码如下:

在这里插入图片描述

冒泡排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 冒泡排序是稳定的排序算法

这里的稳定是因为相等的元素不会做交换操作

在这里插入图片描述

选择排序

选择排序的做法是首先从剩余元素中选择一个最小的数与未排序的第一个元素进行交换:

在这里插入图片描述

接着再从剩余元素中选择一个最小的元素进行交换:

在这里插入图片描述

  • 外层循环 i: [0,N)
  • 内层循环 j: [i+1, N)

设当前 i 位置值为最小值,内层循环找到最小的数,记住下标,跟当前 i 位置进行交换。

代码如下:

在这里插入图片描述

选择排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 选择排序是不稳定的排序算法

插入排序

每次从数组的无序区间中取一个元素插入到有序的区间中:

在这里插入图片描述

  • 外层循环 i: [1,N)
  • 内层循环 j: [i,0)

内层循环中将当前元素跟前一个元素比较,如果比前一个小就交换,否则结束内层循环。

代码如下:

在这里插入图片描述

这个代码还可以继续优化一下,我们可以先记住待插入的元素,然后让 ji 位置往前寻找到合适的位置再插入。在寻找的过程中直接将前面的元素往后面位置覆盖,因为我们记住了一个元素,相当于留出了一个坑位,因此可以前面的元素依次往后挪一个位置,直到找到可插入位置为止。

在这里插入图片描述
在这里插入图片描述

外层先记住当前的 i 位置的值 tmp,内层每次看 j - 1 位置的数,如果比tmp大的就直接将 j - 1 位置覆盖到 j 位置,如果比tmp小,就结束内层循环,将tmp覆盖到 j 位置。

优化后的代码如下:

在这里插入图片描述

这个代码省略了交换操作,做到了原地交换

插入排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 插入排序是稳定的排序算法

O(N^2) 的排序算法性能比较:插入排序 > 选择排序 > 冒泡排序,插入排序性能最好,冒泡排序性能最差。

但是在LeetCode刷题的过程中,很少会用到O(N^2) 的排序算法,因为效率比较低,作为了解即可。

希尔排序

希尔排序的核心思想是先使部分有序,最后让整体有序。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里递增序列也叫做步长,步长的计算公式有很多种,参见下表:

在这里插入图片描述

其中 k=1,2,3,4,5,6…N是数组长度。下面是选择步长公式为 (3^k - 1) / 2 的参考代码:

在这里插入图片描述

希尔排序的特点:

  • 空间复杂度是 O(1),是原地排序算法
  • 希尔排序是不稳定的排序算法

希尔排序的时间复杂度跟所选择的步长计算公式有关:

在这里插入图片描述

选择步长公式为 (3^k - 1) / 2 的时间复杂度是 O(n^3/2),而选择其他步长公式最差可以是 O(n^2)

在大规模乱序数组情况下,希尔排序优于插入排序。

O(NlogN)的排序算法:快排、 归并

快速排序

快排核心思想:选择数组中任一个数字作为分区点,小的放左边,大的放右边

在这里插入图片描述
在这里插入图片描述

快排按照分区点的选择方式不同,我整理的有两种版本的代码:

第一种:以最右边的元素作为分区点的分区逻辑(快慢指针)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值