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


Posted in Javascript onApril 14, 2017

本文实例讲述了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),但是这种排序有一种缺点就是占用空间大。

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

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

附:堆排序算法

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

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

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

下面模拟建堆的过程:

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

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

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

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

Javascript 相关文章推荐
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
Dec 31 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
Feb 28 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
May 16 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
Angular.js中处理页面闪烁的方法详解
Mar 09 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 Javascript
vue使用一些外部插件及样式的配置代码
Nov 18 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
Sep 11 Javascript
如何在JS文件中获取Vue组件
Sep 16 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 Javascript
测量JavaScript函数的性能各种方式对比
Apr 27 Javascript
简单实现JS上传图片预览功能
Apr 14 #Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 #Javascript
微信小程序中的swiper组件详解
Apr 14 #Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 #Javascript
基于JavaScript实现的希尔排序算法分析
Apr 14 #Javascript
Vue2.0 UI框架ElementUI使用方法详解
Apr 14 #Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
Apr 14 #Javascript
You might like
简体中文转换为繁体中文的PHP函数
2006/10/09 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
js常用代码段整理
2011/11/30 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python 装饰器深入理解
2017/03/16 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
查环查孕证明
2014/01/10 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
项目投资意向书范本
2015/05/09 职场文书
联村联户简报
2015/07/21 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
JavaScript实例 ODO List分析
2022/01/22 Javascript