浅谈javascript实现八大排序


Posted in Javascript onApril 27, 2015

开学一个月,已经多次梦见笔试出现数据结构算法题,我对数据结构的恐惧已经多于任何“妖魔鬼怪”了。呵呵,看来真的很有必要复习一下常用的数据结构,免得“噩梦”成真。

数据机构等编程基础的重要性不用多说,直接进入正题。

排序算法,分为内部排序和外部排序。内部排序要使用内存,这里只探讨内部排序。

1,插入排序:直接插入排序和希尔排序

2,选择排序:简单选择排序和堆排序

3,交换排序:冒泡排序和快速排序

4,归并排序

5,基数排序

浅谈javascript实现八大排序

直接插入排序

基本思想:在要排序的一组数,假设前面(n-1)[n>=2]个数已经是排好顺序的,先要把第n个数插入到前面的有序数,使得这n个数也是排好顺序的。如此反复循环,知道全部排好顺序。

希尔排序

基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序的个数)分成若干组,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

简单选择排序

基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后剩下的数当中找出最小的与第二个位置的数交换,如此寻哈un到倒数第二个数和最后一个数为止。

堆排序

基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。

具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。

冒泡排序

基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

快速排序

基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

归并排序

基本排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

基数排序

基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

浅谈javascript实现八大排序

代码演示地址:http://lovermap.sinaapp.com/test/sort.html

现在我们分析一下8种排序算法的稳定性。

(请网友结合前面的排序基本思想来理解排序的稳定性(8种排序的基本思想已经在前面说过,这里不再赘述)不然可能有些模糊)

(1)直接插入排序:一般插入排序,比较是从有序序列的最后一个元素开始,如果比它大则直接插入在其后面,否则一直往前比。如果找到一个和插入元素相等的,那么就插入到这个相等元素的后面。插入排序是稳定的。

(2)希尔排序:希尔排序是按照不同步长对元素进行插入排序,一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,稳定性就会被破坏,所以希尔排序不稳定。

(3)简单选择排序:在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。光说可能有点模糊,来看个小实例:858410,第一遍扫描,第1个元素8会和4交换,那么原序列中2个8的相对前后顺序和原序列不一致了,所以选择排序不稳定。

(4)堆排序:堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...这些父节点选择元素时,有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没有交换,所以堆排序并不稳定。

(5)冒泡排序:由前面的内容可知,冒泡排序是相邻的两个元素比较,交换也发生在这两个元素之间,如果两个元素相等,不用交换。所以冒泡排序稳定。

(6)快速排序:在中枢元素和序列中一个元素交换的时候,很有可能把前面的元素的稳定性打乱。还是看一个小实例:6 4 4 5 4 7 8 9,第一趟排序,中枢元素6和第三个4交换就会把元素4的原序列破坏,所以快速排序不稳定。

(7)归并排序:在分解的子列中,有1个或2个元素时,1个元素不会交换,2个元素如果大小相等也不会交换。在序列合并的过程中,如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,所以,归并排序也是稳定的。

(8)基数排序:是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

8种排序的分类,稳定性,时间复杂度和空间复杂度总结:

浅谈javascript实现八大排序

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
Firefox window.close()的使用注意事项
Apr 11 Javascript
jQuery each()小议
Mar 18 Javascript
Google 静态地图API实现代码
Nov 19 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 Javascript
javascipt匹配单行和多行注释的正则表达式
Nov 20 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
php+ajax+jquery实现点击加载更多内容
May 03 Javascript
JavaScript实现图片滑动切换的代码示例分享
Mar 06 Javascript
Bootstrap笔记之缩略图、警告框实例详解
Mar 09 Javascript
JavaScript实现计算多边形质心的方法示例
Jan 31 Javascript
微信小程序如何访问公众号文章
Jul 08 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 #Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 #Javascript
javascript关于运动的各种问题经典总结
Apr 27 #Javascript
分享9点个人认为比较重要的javascript 编程技巧
Apr 27 #Javascript
javascript+html5实现仿flash滚动播放图片的方法
Apr 27 #Javascript
原生js和jQuery写的网页选项卡特效对比
Apr 27 #Javascript
javascript实现淘宝幻灯片广告展示效果
Apr 27 #Javascript
You might like
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
理解python正则表达式
2016/01/15 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
简单实现python收发邮件功能
2018/01/05 Python
python3个性签名设计实现代码
2018/06/19 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
升职自荐信范文
2013/10/05 职场文书
学前教育毕业生自荐信
2013/10/29 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
话题作文之学会尊重
2019/12/16 职场文书
导游词之西安骊山
2019/12/20 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
golang中的struct操作
2021/11/11 Golang
Golang实现可重入锁的示例代码
2022/05/25 Golang
ubuntu下常用apt命令介绍
2022/06/05 Servers