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

 更新时间:2017年04月14日 11:32:38   作者:布瑞泽的童话  
这篇文章主要介绍了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),但是这种排序有一种缺点就是占用空间大。

所以我们需要介绍一种更加优秀的排序,也就是堆排序

附:堆排序算法

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

堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序区中选取最大(或最小)关键字的记录变得简单。我们以大跟堆为例子,排序的基本操作如下:

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

下面模拟建堆的过程:

堆排序对于记录数较少的文件并不值得提倡,但是对于n较大的文件还是挺有效的。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结

希望本文所述对大家JavaScript程序设计有所帮助。

相关文章

  • 基于 Immutable.js 实现撤销重做功能的实例代码

    基于 Immutable.js 实现撤销重做功能的实例代码

    这篇文章主要介绍了基于 Immutable.js 实现撤销重做功能及一些需要注意的地方,需要的朋友可以参考下
    2018-03-03
  • javascript 响应键盘特定按键(只响应数字键)

    javascript 响应键盘特定按键(只响应数字键)

    响应键盘特定按键(只响应数字键),大家可以看看思路。
    2009-03-03
  • 微信小程序绘制半圆(弧形)进度条

    微信小程序绘制半圆(弧形)进度条

    这篇文章主要为大家详细介绍了微信小程序绘制半圆(弧形)进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • JavaScript中的DOM遍历详解

    JavaScript中的DOM遍历详解

    文档对象模型 (DOM) 表示 HTML 文档的结构,导航或“遍历”此结构是 Web 开发的基本方面,使开发人员能够在网页上选择、修改、删除或添加内容,本文深入研究了使用 JavaScript 进行 DOM 遍历的艺术,提供了一个强大的工具包来处理各种遍历场景
    2023-09-09
  • JS作用域深度解析

    JS作用域深度解析

    这篇文章主要为大家详细介绍了JS作用域,剖析JS的作用域问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JS利用正则表达式实现简单的密码强弱判断实例

    JS利用正则表达式实现简单的密码强弱判断实例

    这篇文章主要给大家介绍了关于JS利用正则表达式实现简单的密码强弱判断的相关资料,实现后的效果非常简单,但也挺实用的,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-06-06
  • JS+CSS设置img在DIV中只显示Img垂直居中的部分

    JS+CSS设置img在DIV中只显示Img垂直居中的部分

    img的宽和Div相同,但高不固定,要求只显示Img垂直居中的部分,下面有个不错的示例,感兴趣的朋友可以参考下
    2013-10-10
  • electron-builder允许安装时请求提升权限的场景分析

    electron-builder允许安装时请求提升权限的场景分析

    electron-builder 作为一个用于 Electron 应用程序打包的工具,需要下载并使用 Electron 运行时来创建可执行文件,这篇文章给大家介绍electron-builder允许安装时请求提升权限的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • JavaScript中重名的函数与对象示例详析

    JavaScript中重名的函数与对象示例详析

    最近同事问了一个问题,说在js中如果函数与对象重名了会怎么样?仔细详细这个问题值得讨论一下,所以便有了这篇文章,这篇文章主要给大家介绍了关于JavaScript中重名的函数与对象的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧啊。
    2017-09-09
  • 将html页面保存成图片,图片写入pdf的实现方法(推荐)

    将html页面保存成图片,图片写入pdf的实现方法(推荐)

    下面小编就为大家带来一篇将html页面保存成图片,图片写入pdf的实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论