JavaScript实现的选择排序算法实例分析

作者:代码拾荒

时间:2026-10-23

浏览:281

本文详细解析了JavaScript中的选择排序算法,包括简单选择排序、树形选择排序及堆排序的实现原理与代码示例。文章对比了各算法的时间复杂度,重点介绍了堆排序的建堆与调整过程,为开发者提供实用的排序算法参考。

文章目录

选择排序算法概述

本文通过具体实例介绍JavaScript中的选择排序算法,供读者参考学习。

简单选择排序是一种直观的比较排序方法。其核心逻辑是从数组起始位置开始,将首个元素与其他所有元素逐一比较,找出最小值并将其交换至数组首位。随后,算法从第二个位置继续执行相同操作,直至处理到倒数第二个元素,此时整个数组即完成排序。

具体实现代码如下:

简单选择排序实现


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript选择排序</title>
</head>
<body>
<script type="text/javascript">
 function selectSort(nums){//选择排序
  var min;//最小值
  for(var outer=0;outer<nums.length-1;outer++){//外循环选中元素
   min=outer;
   for(var inner=outer+1;inner<=nums.length;++inner){
    if(nums[inner]<nums[min]){//如果内循环中元素比选中元素小
     min=inner;//将其标为最小元素
    }//直到每次外循环的最小元素
    swap(nums,outer,min);//最小值被调整到合适的位置
   }
  }
 }
 function swap(arr,i,j){//交换位置
  var temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
 }
 function show(nums){//显示数组
  for(var i=0;i<nums.length;i++){
   document.write(nums[i]+' ');
  }
  document.write('<br>');
 }
 var nums=[6,8,0,6,7,4,3,5,5,10];
 show(nums);//6 8 0 6 7 4 3 5 5 10
 selectSort(nums);
 show(nums);//0 3 4 5 5 6 6 7 9 10
</script>
</body>
</html>

树形选择排序原理

分析可知,简单选择排序的时间复杂度为O(n2)。该算法的主要开销在于关键字间的比较,因此改进方向应聚焦于减少比较次数。现实生活中,锦标赛模式提供了优化思路:在8人比赛中选出冠军无需进行7+6+5=18场对决,只需通过两两比较的11场比赛即可确定。基于此思想衍生出的算法称为树形选择排序。

树形选择排序依据锦标赛逻辑执行。首先对n个记录的关键字进行两两比较,随后在产生的n/2个较小值中再次进行两两比较,直至找出最小关键字。该过程可用完全二叉树表示。由于含n个结点的完全二叉树深度为log2n+1,每次选取次小关键字仅需log2n次操作,因此时间复杂度优化至O(nlog2n)。然而,该方法的缺点在于占用空间较大。

选择排序算法概述

堆排序算法详解

鉴于上述局限,接下来介绍一种性能更优的排序算法——堆排序。

附:堆排序算法实现

堆排序仅需一个记录大小的辅助空间,每个待排序记录仅占用一个存储单元。

堆排序利用大根堆(或小根堆)堆顶记录关键字最大(或最小)的特性,简化了从无序区选取最大(或最小)关键字的过程。以大根堆为例,基本排序操作如下:

首先是建堆,建堆就是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,建堆的时间复杂度为O(n)。 接下来是调整堆,调整堆在建堆和堆排序的过程中都会用到,利用的思想是比较节点i和它的孩子节点left(i)和right(i),选出三者最大(或最小)者,如果最大(小)值不是节点i而是它的一个子节点,那么交换两个节点,然后继续递归。 然后是堆排序:将堆的根节点取出,最后一个元素替换根节点,将前面len-1个节点继续进行堆调整的过程,然后再讲根节点取出,直到所有结点取出。调整堆的时间复杂度为O(log2n) 所以堆排序的时间复杂度为O(nlog2n)。堆排序是就地排序,其辅助空间为O(1)。但是它不稳定,(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)。

以下模拟建堆的具体过程:

选择排序算法概述

对于记录数较少的文件,堆排序的优势并不明显;但对于数据量较大的文件,该算法依然具有较高的效率。

选择排序算法概述

感兴趣读者可进一步查阅本站相关专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》。

希望本文所述内容能对大家的JavaScript程序设计工作有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章