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 相关文章推荐
随鼠标上下滚动的jquery代码
Dec 05 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
Sep 18 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
Sep 26 Javascript
jQuery 调用WebService 实例讲解
Jun 28 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
Dec 05 Javascript
Vue.js父与子组件之间传参示例
Feb 28 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
Apr 07 Javascript
jQuery+PHP+Mysql实现抽奖程序
Apr 12 jQuery
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
May 07 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
Jun 03 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
Jul 23 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 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP新手上路(二)
2006/10/09 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
cookie的secure属性详解
2015/04/08 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
详解Python if-elif-else知识点
2018/06/11 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python对列表的操作知识点详解
2019/08/20 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
保险专业大专生求职信
2013/10/26 职场文书
教师党员思想汇报
2014/01/06 职场文书
师说教学反思
2014/02/07 职场文书
高中生评语大全
2014/04/25 职场文书
金秋助学感谢信
2015/01/21 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
繁星春水读书笔记
2015/06/30 职场文书
女儿满月酒致辞
2015/07/29 职场文书