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 相关文章推荐
js实现window.open不被拦截的解决方法汇总
Oct 30 Javascript
了不起的node.js读书笔记之node.js中的特性
Dec 22 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
javascript数据结构之双链表插入排序实例详解
Nov 25 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
May 05 Javascript
jQuery EasyUI 页面加载等待及页面等待层
Feb 06 Javascript
javascript中apply/call和bind的使用
Feb 15 Javascript
原生js实现旋转木马轮播图效果
Feb 27 Javascript
浅谈在Vue-cli里基于axios封装复用请求
Nov 06 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
Vue源码中要const _toStr = Object.prototype.toString的原因分析
Dec 09 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
Apr 10 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操作xml
2013/10/27 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
js图片处理示例代码
2014/05/12 Javascript
初识Node.js
2014/09/03 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
微信小程序开发探究
2016/12/27 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
Python实现将xml导入至excel
2015/11/20 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
python中类与对象之间的关系详解
2020/12/16 Python
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
上班离岗检讨书
2014/01/27 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书