手写 “ 选择排序 ”

在我们写算法中,如果需要简单直观的排序算法,适用于小型数据集,这时候我们就可以用到选择排序。

概述

选择排序是一种简单直观的排序算法,适用于小型数据集。它的基本思想是每次从待排序的元素中选择最小(或最大)的一个元素,放到已排好序的元素的末尾,直到所有元素都排完为止。

选择排序的具体步骤如下:

  1. 遍历待排序的数组,将第一个元素作为当前最小值
  2. 在剩余的未排序部分中,找到最小元素的位置
  3. 将最小元素与当前位置交换,将最小元素放到已排好序的末尾
  4. 重复步骤2和步骤3,直到所有元素都排完

选择排序每次只进行一次交换操作,因此相较于其他排序算法,例如冒泡排序,它的交换次数较少。但是,选择排序的时间复杂度为O(n^2),其中n是待排序数组的长度,因此对于大型数据集效率较低。

尽管选择排序不是一种高效的排序算法,但它的实现简单易懂,并且在某些特定情况下可能是一个合适的选择。然而,当需要对大量数据进行排序时,更高效的排序算法,如快速排序或归并排序,通常更加适用。

选择排序的步骤:

  1. 遍历待排序的数组
  2. 将当前位置的元素设为最小值
  3. 在剩余未排序的部分中,找到最小元素的位置
  4. 如果最小元素的位置不是当前位置,则交换最小元素与当前位置的元素
  5. 将当前位置向后移动一位,重复步骤2至步骤4,直到遍历完整个数组

这样,经过一轮遍历,最小的元素就会被放置到数组的第一个位置。然后,继续进行下一轮的遍历,从第二个位置开始重复上述步骤,每次找到剩余未排序部分的最小元素,并将其放置到已排好序的元素的末尾。重复这个过程,直到所有元素都被排序。

选择排序的关键点在于每次遍历都会找到剩余未排序部分的最小元素,并将其放置到已排好序的元素的末尾。通过不断交换位置,逐渐形成有序的子数组。

需要注意的是,选择排序 是一种不稳定的排序算法 ,即相同元素的顺序可能会发生改变。此外,选择排序的时间复杂度为O(n^2),其中n是待排序数组的长度,因此对于大型数据集效率较低。

算法分析

选择排序的时间复杂度为O(n^2),其中n是待排序数组的长度。具体来说,选择排序需要进行n-1轮遍历,每轮遍历需要在剩余未排序部分中找到最小元素的位置,因此总的比较次数为:

(n-1) + (n-2) + ... + 1 = n*(n-1)/2

因此,选择排序的时间复杂度为O(n^2)

选择排序的空间复杂度为O(1),即不需要额外的存储空间,只需要在原数组上进行操作,因此空间复杂度相对较低。

选择排序的优点是简单直观、实现易懂,而且交换次数相对较少。但是,当数据量很大时,选择排序的效率会变得很低,因为它需要进行大量的比较和交换操作。因此,在实际应用中,除非数据集规模很小或者已经基本有序,否则选择排序并不是一个好的选择。

javascript 复制代码
function selectionSort(arr) {
  const n = arr.length;
  for (let i = 0; i < n - 1; i++) {
    let minIndex = i;
    for (let j = i + 1; j < n; j++) {
      if (arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }
    if (minIndex !== i) {
      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
    }
  }
  return arr;
}

// 示例
const arr = [3, 1, 4, 5, 2];
console.log(selectionSort(arr)); // [1, 2, 3, 4, 5]

selectionSort 函数接受一个待排序的数组,使用两层循环遍历数组,找到最小值的下标,然后交换当前元素和最小元素的位置。最后返回排序后的数组。

选择排序的优点和局限性如下:

优点:

  • 实现简单直观:选择排序算法的实现非常简单,易于理解和实现。
  • 不占用额外空间:选择排序是原地排序,不需要额外的存储空间。

局限性:

  • 效率较低:选择排序的时间复杂度为O(n^2),其中n是待排序数组的长度。对于大规模数据集,选择排序效率较低,因为它需要进行大量的比较和交换操作。
  • 不稳定性:选择排序是一种不稳定的排序算法,即相同元素的顺序可能会发生改变。
  • 无法提前终止:无论原始数组是否已经有序,选择排序都会进行完全的n-1轮遍历。

由于选择排序的局限性,当需要对大量数据进行排序时,更高效的排序算法,如快速排序、归并排序或堆排序等,通常更加适用。
这些算法的时间复杂度可以达到 O(nlogn) 级别,相较于选择排序具有更好的性能。但在某些特定情况下,选择排序仍然可能是一个合适的选择,例如对于小规模数据集或者已经基本有序的数据集。

相关推荐
福大大架构师每日一题10 分钟前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言
Myli_ing15 分钟前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
EterNity_TiMe_25 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
机器学习之心36 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
I_Am_Me_1 小时前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
yyt_cdeyyds1 小时前
FIFO和LRU算法实现操作系统中主存管理
算法
℘团子এ1 小时前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z1 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
daiyang123...1 小时前
测试岗位应该学什么
数据结构
alphaTao1 小时前
LeetCode 每日一题 2024/11/18-2024/11/24
算法·leetcode