冒泡排序、选择排序、插入排序

本文详细介绍了三种基础排序算法:冒泡排序的通过相邻元素比较并交换位置,选择排序每次选取未排序部分的最大/小元素,插入排序通过前后对比插入位置。分别阐述了它们的实现、优缺点,以及针对特定场景的优化策略。

冒泡排序

思路

  将相邻的两个元素进行比较,然后将较小的元素放在左边,将较大的元素放在右边。一直重复,直到排序完毕。

实现(JAVA)

在这里插入图片描述

优缺点

  每一趟排序后都会将最大的元素排在最右边,所以之后每趟排序都会减少一个待排元素

  对n个元素进行排序,第 i 趟需要比较n-i次,共需要n-1趟排序

稳定性:稳定(如果a原本在b前面,且a = b,排序后a仍然在b前面)

时间复杂度最好情况为O(n),即全是正序的情况下。   最坏情况为O(n2),即全是倒序的情况下

空间复杂度为O(1)

优化

先判断数组内的元素是否有序,如果数组内的元素本身有序,则不进行排序。
在这里插入图片描述

选择排序

思路

  每次遍历所有待排元素,选择其中最大/最小的元素,将其放在排序序列的起始位置。然后,再次遍历所有待排的剩余元素,选择其中最大/最小的元素,将其放在已排序列的末尾。重复此操作,直到排序完成。

实现(JAVA)

在这里插入图片描述

优缺点

  一轮比较只需要交换一次位置。n个元素进行排序共需要交换n-1次

稳定性:不稳定(如果原本a在b的前面,且a = b,排序后a可能出现在b的后面)

时间复杂度为O(n2)

空间复杂度为O(1)

插入排序

思路

  从第一个元素开始,默认第一个元素已经有序。
  取出下一个元素,与前面已经排序的元素从后向前进行比较,如果此元素小于被比较的元素(已排序),则将被比较的元素向后移动一个位置。
  直到找到此元素大于被比较的元素(已排序)的位置,将其插入到该位置。
  重复此操作,直到排序完成。

实现(JAVA)

在这里插入图片描述

优缺点

相比于冒泡排序和选择排序更快

稳定性:稳定

时间复杂度最好情况为O(n),最坏情况为O(n2)。

空间复杂度为O(1)

### 冒泡排序选择排序插入排序的工作原理与区别分析 #### 冒泡排序的工作原理 冒泡排序的基本思想是通过多次遍历数组,比较相邻的两个元素,并在顺序不合法的情况下交换它们的位置。这样,每一轮遍历结束后,最大的元素会“冒泡”到数组的末尾。以升序排列为例,第一趟遍历完成后,最大的元素会被放置在最后一个位置;第二趟遍历则处理前N-1个元素,将次大的元素放在倒数第二个位置,以此类推,直到整个数组有序为止[^3]。 冒泡排序的时间复杂度为O(n²),在最坏情况下需要进行大量的交换操作。然而,如果能够引入一个标志位来检测是否发生过交换,可以在最佳情况下将时间复杂度降低至O(n)(即当输入数组已经有序时)[^2]。 ```python def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break ``` #### 选择排序的工作原理 选择排序的核心在于每次遍历过程中找到当前未排序部分中的最小(或最大)元素,并将其放到已排序部分的末尾。它并不会频繁地进行交换操作,而是在每一趟遍历时记录下最小值的位置,仅在最后执行一次交换即可完成该步排序任务。这种方式减少了交换次数,使得其性能在某些特定场景下优于冒泡排序[^1]。 选择排序的时间复杂度同样为O(n²),但由于其简单的实现方式以及较少的数据移动特性,在实际应用中有时也会被采用。 ```python def selection_sort(arr): n = len(arr) for i in range(n): min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] ``` #### 插入排序的工作原理 插入排序的思想类似于人们整理扑克牌的方式——逐步构建有序序列,每次从无序部分取出一个元素插入到已排序部分的适当位置上。具体来说,对于每一个新加入的元素,都会向前扫描并找到合适的位置插入,同时保持前面的所有元素始终处于有序状态。这种方法对于接近有序的数据表现尤为出色,甚至可以达到线性时间复杂度O(n)[^2]。 插入排序的平均时间复杂度也是O(n²),但它通常比冒泡排序更高效,尤其是在处理小规模或者几乎已排序的数据集时效果更好。 ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key ``` #### 区别分析 - **交换机制**:冒泡排序依赖于连续的两两比较和即时交换;相比之下,选择排序只会在每轮结束时做一次交换;而插入排序则是通过移动元素为空间腾出位置再插入目标值。 - **效率差异**:虽然三者都具有相同的最坏情况下的时间复杂度O(n²),但在实践中,插入排序往往表现出更好的性能,特别是面对近乎有序的数据时优势明显;选择排序因为交换次数最少而适用于那些写操作成本较高的环境;至于冒泡排序,则由于其实现简单但效率相对较低的原因,现在较少被推荐使用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值