手写 “ 选择排序 ”

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

概述

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

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

  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) 级别,相较于选择排序具有更好的性能。但在某些特定情况下,选择排序仍然可能是一个合适的选择,例如对于小规模数据集或者已经基本有序的数据集。

相关推荐
yi0118 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
程序员Sunday9 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
默_笙10 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
思无邪6611 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
灯澜忆梦11 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
禾小西11 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
小蒋观天下11 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J11 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛12 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有12 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode