首页 > 编程语言 >写一个方法实现“选择排序算法”,并解释下时间复杂度和空间复杂度

写一个方法实现“选择排序算法”,并解释下时间复杂度和空间复杂度

时间:2024-11-30 09:24:06浏览次数:9  
标签:minIndex arr 复杂度 算法 数组 排序

function selectionSort(arr) {
  const n = arr.length;

  for (let i = 0; i < n - 1; i++) {
    // Find the minimum element in the unsorted part of the array
    let minIndex = i;
    for (let j = i + 1; j < n; j++) {
      if (arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }

    // Swap the found minimum element with the first element of the unsorted part
    if (minIndex !== i) {
      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]; // Using ES6 destructuring for swap
    }
  }

  return arr;
}


// Example usage:
const unsortedArray = [64, 25, 12, 22, 11];
const sortedArray = selectionSort(unsortedArray);
console.log(sortedArray); // Output: [11, 12, 22, 25, 64]



时间复杂度:

选择排序的时间复杂度始终为 O(n^2),其中 n 是数组的长度。这是因为外层循环运行 n-1 次,内层循环的迭代次数从 n-1 递减到 1。无论输入数组是否有序,都需要进行这些比较和交换。

  • 最佳情况: O(n^2) 即使数组已经排序,算法仍然会执行所有的比较。
  • 平均情况: O(n^2)
  • 最坏情况: O(n^2)

空间复杂度:

选择排序的空间复杂度为 O(1),也称为常量空间复杂度。这是因为它只使用了几个额外的变量(minIndexij,以及用于交换的临时变量), 这些变量的数量不随输入数组的大小而变化。 排序是在原数组上进行的,没有使用额外的数组或数据结构来存储元素。 因此,无论输入数组的大小如何,所需的额外空间都保持不变。

总结:

选择排序是一种简单的排序算法,易于理解和实现。然而,由于其 O(n^2) 的时间复杂度,对于大型数据集来说效率不高。 对于小型数据集或对性能要求不高的场景,它可能是一个合适的选择。 如果处理大型数据集,建议考虑更高效的排序算法,例如归并排序或快速排序,它们的时间复杂度为 O(n log n)。

标签:minIndex,arr,复杂度,算法,数组,排序
From: https://www.cnblogs.com/ai888/p/18578009

相关文章

  • 写一个方法实现“交换排序算法”,并解释下时间复杂度和空间复杂度
    /***交换排序(冒泡排序)**@param{Array<number>}arr待排序的数组*@returns{Array<number>}排序后的数组*/functionexchangeSort(arr){constn=arr.length;letswapped;//优化:如果一趟没有交换,说明已经有序for(leti=0;i<n-1;i++){......
  • 数据结构与算法(排序算法)
    排序的概念1.排序是指将一组数据,按照特定的顺序进行排列的过程。2. 这个过程通常是为了使数据更加有序,从而更容易进行搜索、比较或其他操作。常见的排序算法插入排序  1.把待排序的记录,按其关键码值的大小,逐个插入到一个已经排好序的有序序列中,直......
  • 【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系
    文章目录一、树的概念与结构1.树的概念2.树的相关术语3.树的表示4.树形结构实际运用举例二、二叉树的概念及特殊二叉树1.二叉树的概念2.特殊的二叉树满二叉树完全二叉树二叉树的性质(由满二叉树特点推导)三、二叉树的存储结构1.二叉树的顺序结构2.二叉树的链式结构......
  • 回溯算法part03
    文章参考来源代码随想录93.复原IP地址1.递归参数字符串(不能加const因为要在字符串上加‘.’,因此本题不用组合,直接将字符串加入到结果中),当前层递归开始遍历的地方,计数器(记录‘.’的个数)2.递归终止条件当计数器到达3时(说明分成四段了),判断最后一段是否满足区间函数,若满足加......
  • 顺序表的时间复杂度介绍
    顺序表的时间复杂度介绍引言顺序表(Array)是一种常见的数据结构,它在逻辑上是一种线性表,物理结构上是顺序存储。顺序表通过连续的内存空间存储数据元素,具有高效的随机访问特性。本文将详细介绍顺序表的增删改查操作的时间复杂度,并从最好、最坏和平均三个角度分析其性能表现。同时,我......
  • DDD之理解复杂度、尊重复杂度、掌控复杂度
    DDD之理解复杂度、尊重复杂度、掌控复杂度本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。背景关......
  • 代码随想录算法训练营第三十一天|leetcode56. 合并区间、leetcode738.单调递增的数字
    1leetcode56.合并区间题目链接:56.合并区间-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili思路:其实很清楚,跟之前的方法差不多,但是自己写的时候就是有地方不会了,会不知道接下来的思路是什么1.1视频后的思路卡壳......
  • 双指针算法5
    原题1:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。原题2:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。原题3:给你一个单链表的头节点 head ,请你判断该链表是否为回文......
  • 算法渐进时间复杂度的比较
    算法渐进时间复杂度的比较与可接受范围在学习数据结构的第一章节中,我们经常会遇到一个关于算法渐进时间复杂度的比较结论:这个结论描述了不同时间复杂度函数在(N)趋于无穷大时的增长速率。本文将探讨这些时间复杂度的可接受范围,并解释哪些复杂度在实际应用中是可以接受的。......
  • 算法与数据结构练习——异或
    知识点讲解:一、异或操作定义:异或是指相同为0,不同为1,也可理解为无进位相加!!很重要!!二、关于异或运算的几个性质:1.0^N=N       (0和任何数异或都是原来的数)2.N^N=0       (任何数异或自己都是0)3.满足交换律和结合律:所以无论怎么改变顺序,最后的结果都是一样......