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系列(2) 揭秘命名函数表达式
Jan 15 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
Oct 01 Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
JS搜狐面试题分析
Dec 16 Javascript
js实现带缓动动画的导航栏效果
Jan 16 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
微信小程序实现带刻度尺滑块功能
Mar 29 Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 Javascript
简述JS控制台的使用
Jul 15 Javascript
Vue 列表页带参数进详情页的操作(router-link)
Nov 13 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
php2html php生成静态页函数
2008/12/08 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
python登录QQ邮箱发信的实现代码
2013/02/10 Python
Python编码时应该注意的几个情况
2013/03/04 Python
python实现超简单端口转发的方法
2015/03/13 Python
python杀死一个线程的方法
2015/09/06 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
超简单的Python HTTP服务
2019/07/22 Python
python数据预处理方式 :数据降维
2020/02/24 Python
python和php哪个容易学
2020/06/19 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
新学期家长寄语2016
2015/12/03 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python