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模拟select,jselect的方法实现
Nov 08 Javascript
jquery+css+ul模拟列表菜单具体实现思路
Apr 15 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
Sep 24 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
深入浅析JavaScript面向对象和原型函数
Feb 06 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
Jul 11 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
Nov 19 Javascript
微信小程序实现点击按钮后修改颜色
Dec 05 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生成EXCEL的东东
2006/10/09 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
python中from module import * 的一个坑
2014/07/20 Python
Python显示进度条的方法
2014/09/20 Python
python中set()函数简介及实例解析
2018/01/09 Python
python保存文件方法小结
2018/07/27 Python
python3跳出一个循环的实例操作
2020/08/18 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
致短跑运动员广播稿
2014/01/09 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
保险公司早会主持词
2014/03/22 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
安全目标责任书
2014/07/22 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
如何在C++中调用Python
2021/05/21 Python