实现选择排序
字数 924 2025-10-27 22:20:11

实现选择排序

题目描述:给定一个整数数组,使用选择排序算法将其按升序排列。选择排序的工作原理是每次从未排序部分找到最小元素,将其放到已排序部分的末尾。

解题过程:

  1. 基本思想
    选择排序将数组分为两部分:左侧是已排序部分(初始为空),右侧是未排序部分(初始为整个数组)。算法重复以下步骤直到未排序部分为空:

    • 在未排序部分中查找最小元素
    • 将该最小元素与未排序部分的第一个元素交换位置
    • 已排序部分长度增加1,未排序部分长度减少1
  2. 具体步骤
    假设数组为arr,长度为n:

    • 第1轮:在索引0到n-1范围内找到最小元素,与arr[0]交换
    • 第2轮:在索引1到n-1范围内找到最小元素,与arr[1]交换
    • 第3轮:在索引2到n-1范围内找到最小元素,与arr[2]交换
    • ...
    • 第n-1轮:在索引n-2到n-1范围内找到最小元素,与arr[n-2]交换
  3. 详细实现
    以数组[64, 25, 12, 22, 11]为例:

第1轮:

  • 未排序部分:[64,25,12,22,11],最小元素是11(索引4)
  • 交换arr[0]和arr[4]:数组变为[11,25,12,22,64]

第2轮:

  • 未排序部分:[25,12,22,64],最小元素是12(索引2)
  • 交换arr[1]和arr[2]:数组变为[11,12,25,22,64]

第3轮:

  • 未排序部分:[25,22,64],最小元素是22(索引3)
  • 交换arr[2]和arr[3]:数组变为[11,12,22,25,64]

第4轮:

  • 未排序部分:[25,64],最小元素是25(索引3)
  • 交换arr[3]和arr[3](实际上不需要交换)

最终得到有序数组:[11,12,22,25,64]

  1. 算法特点

    • 时间复杂度:O(n²),因为需要进行n-1轮比较,每轮比较n-i次
    • 空间复杂度:O(1),是原地排序算法
    • 不稳定排序:相等元素的相对位置可能改变
    • 交换次数较少:最多进行n-1次交换
  2. 优化考虑
    虽然选择排序的时间复杂度固定为O(n²),但可以通过以下方式优化:

    • 在每轮中同时记录最小值和最大值(双向选择排序)
    • 对于部分有序的数组,选择排序并没有优势
实现选择排序 题目描述:给定一个整数数组,使用选择排序算法将其按升序排列。选择排序的工作原理是每次从未排序部分找到最小元素,将其放到已排序部分的末尾。 解题过程: 基本思想 选择排序将数组分为两部分:左侧是已排序部分(初始为空),右侧是未排序部分(初始为整个数组)。算法重复以下步骤直到未排序部分为空: 在未排序部分中查找最小元素 将该最小元素与未排序部分的第一个元素交换位置 已排序部分长度增加1,未排序部分长度减少1 具体步骤 假设数组为arr,长度为n: 第1轮:在索引0到n-1范围内找到最小元素,与arr[ 0 ]交换 第2轮:在索引1到n-1范围内找到最小元素,与arr[ 1 ]交换 第3轮:在索引2到n-1范围内找到最小元素,与arr[ 2 ]交换 ... 第n-1轮:在索引n-2到n-1范围内找到最小元素,与arr[ n-2 ]交换 详细实现 以数组[ 64, 25, 12, 22, 11 ]为例: 第1轮: 未排序部分:[ 64,25,12,22,11 ],最小元素是11(索引4) 交换arr[ 0]和arr[ 4]:数组变为[ 11,25,12,22,64 ] 第2轮: 未排序部分:[ 25,12,22,64 ],最小元素是12(索引2) 交换arr[ 1]和arr[ 2]:数组变为[ 11,12,25,22,64 ] 第3轮: 未排序部分:[ 25,22,64 ],最小元素是22(索引3) 交换arr[ 2]和arr[ 3]:数组变为[ 11,12,22,25,64 ] 第4轮: 未排序部分:[ 25,64 ],最小元素是25(索引3) 交换arr[ 3]和arr[ 3 ](实际上不需要交换) 最终得到有序数组:[ 11,12,22,25,64 ] 算法特点 时间复杂度:O(n²),因为需要进行n-1轮比较,每轮比较n-i次 空间复杂度:O(1),是原地排序算法 不稳定排序:相等元素的相对位置可能改变 交换次数较少:最多进行n-1次交换 优化考虑 虽然选择排序的时间复杂度固定为O(n²),但可以通过以下方式优化: 在每轮中同时记录最小值和最大值(双向选择排序) 对于部分有序的数组,选择排序并没有优势