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

所属分类: 网络编程 / JavaScript 阅读数: 1976
收藏 0 赞 0 分享

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

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

附:堆排序算法

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

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

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

下面模拟建堆的过程:

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

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结

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

更多精彩内容其他人还在看

jQuery 行级解析读取XML文件(附源码)

项目中应用jQuery解析读取XML语言配置文件来实现语言的调度。这是jQuery解析读取XML文件功能的测试源码,现拿出来分享。
收藏 0 赞 0 分享

JS 文件本身编码转换 图文教程

JS编码转换,这句话本身就是一句具有二重义的话。通常理解为JS文件里能转换编码的代码,但是,我所碰到的问题并不是这样的,是要解决JS文件本身的编码问题,它是UTF-8编码的还是ANSI编码的?
收藏 0 赞 0 分享

jQuery Ajax之$.get()方法和$.post()方法

load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现Ajax的全部价值。在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或者是后面要讲解到的$.ajax方法)。
收藏 0 赞 0 分享

jQuery Ajax之load()方法

jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第2层是laod()、$.get()和$.post()方法,第3层是$.getScript()和$.getJSON()方法。
收藏 0 赞 0 分享

JavaScript 核心参考教程 内置对象

JavaScript 是根据 "ECMAScript"标准制定的网页脚本语言。这个标准由 ECMA 组织发展和维护。ECMA-262 是正式的 JavaScript 标准。
收藏 0 赞 0 分享

JavaScript 核心参考教程 RegExp对象

JavaScript 核心参考教程RegExp对象,学习正则表达式的朋友可以参考下。
收藏 0 赞 0 分享

javascript hashtable实现代码

javascript中没有像c#,java那样的哈希表(hashtable), 然而,javascript中的Array也只有一些类似于'哈希表'的非常简单功能。
收藏 0 赞 0 分享

百度留言本js 大家可以参考下

百度留言本js 大家可以参考下。
收藏 0 赞 0 分享

javascript 判断某年某月有多少天的实现代码 推荐

以前写网页的时候,经常碰到选择日期的问题,其实就是判断某年某月有多少天。
收藏 0 赞 0 分享

让iframe子窗体取父窗体地址栏参数(querystring)

突然用到,记录一下,对地址栏字符串用正则处理最好,有时间研究一下。 主要是思路。
收藏 0 赞 0 分享
查看更多