1.冒泡排序:

比较相邻的两个数,如果前一个数大于后一个数,就将这两个数换位置。每一次遍历都会将本次遍历最大的数冒泡到最后。为了将n个数排好序,需要n-1次遍历。如果某次遍历中,没有调整任何两个相邻的数的位置关系,说明此时数组已排好序,可以结束程序。

2.选择排序

第i轮遍历arr[0:n-i]选出最大的数,与arr[n-i]互换。

3.插入排序

数组的前面部分已经排好序,要把当前数字插入到前面已排好序的数组的相应位置。可能有人会有疑问为什么默认数组前面部分已排好序?是怎么排好序的?是因为当排序开始时,从第2个数字开始进行向前插入,此时当前数字索引为1,当前数字前面仅有一个数字,因此可以认为前面部分已经排好序,将这个数字插入到相应位置之后数组仍然是有序的。每次都将当前数字插入到对应的位置,因此每次插入之后前面的数组仍是排好序的。

4.shell排序

加了step的插入排序。分别以索引数为0,1,…step-1的元素为起点,将其看做不同的组,0、0+step,0+2_step,…,0+n_step为一组,1,1+step,1+2_step,…,1+n_step为一组依次分组,按照组为单位进行插入排序。各组都已经插入排序一轮过后,将step除以2向下取整,再进行分组并将各组分别进行插入排序,直到step为0。step的取值与性能直接相关,需要思考后取值。并且这里的分组仅仅是逻辑上分组,并没有开辟新的地址空间将其进行物理上的分组。

5.合并排序

举个例子:有 4312 32 29 66 78 31这个数组要用合并排序。先将相邻两数分为一组进行合并 43|1232|29 66|78 31 结果为1243 29 32 66 78 31

再将组的大小乘以二(1243|29 32) (66 78|31) 本次合并后结果为1229 32 43 31 66 78

再将组的大小乘以二1243 29 32 | 66 78 31 合并结果:1229 31 32 43 66 78

合并的过程中要开辟新的数组arr,建立两个指针i,j分别指向arr1与arr2,此时arr1与arr2都是排好序的,然后每次都将arr1[i]与arr2[j]较小的数加到arr中并将指针后移。最后哪个数组有剩余的数在追加到arr后面。

6.自然合并排序

合并排序的分组是死板的没有利用到数组中原本就是顺序的子序列。

如果数组为4356 79 12 33 90 66 将其分组为4356 79 | 12 33 90 | 66 再将相邻的,原本就是从小到大的顺序的数组进行合并,效果会更好。

7.基数排序(LSDleast significant digit first)

LSD中没有数值之间的比较。建立一个[10][]的二维数组arr。挑选出要排序数组中最大的数字,计算该数字的位数记为digitNum。将数组中的所有数字填充到digitNum位,位数不够的高位补0。然后遍历digitNum次,从低位开始。第i次遍历按照将数组中元素的第i位的数值,将元素num放到二维数组相应位置处,如果num第i位数值为n,则执行arr[n].push(num)的操作。每次遍历之后,将arr[0:9]各数组的元素依次取出,并且重新初始化二维数组。直到遍历到最高位为止,再取出的就是已经排好序的。

8.基数排序(MSDmost significant digit first)

从高位开始,依然没有数值之间的比较。将最初的元素序列按照各元素最高位的数值进行分组,将分组后,组中只有一个元素或者多个相等元素的组拼接到result数组中,而有多个不同元素的组再递归地向下分,取的位次依次减少。

9.快速排序

将数组头部的元素pivotNum作为一个基准,通过两个指针指向数组的头部和尾部,经过一次partition以后将pivotNum放在一个位置pivot,pivot前面的数小于pivotNum,后面的数大于pivotNum。为了防止最坏情况的发生,可以在数组中随机选出一个数来与数组头部元素换位置,来降低具体实例与最坏情况的关联性。

10.堆排序

将数组看做完全二叉树,因此节点i的左右子节点的索引分别为2i+1与2i+2。通过从根节点开始令小的值下沉,或者从最后的叶节点开始令大的值上浮的方法,将一个数组构造成一个大根堆。再将大根堆的头元素与尾元素换位置,这样就将当前最大值置换到了尾部。然后下次构建大根堆的时候,将刚置换过的尾部元素刨除在外不做为节点。

Javascript实现10种排序算法的更多相关文章

  1. 记一下JavaScript的几种排序算法

    零.写在最前 排序的方法有很多种,这篇文章只是记录我熟悉的算法: 我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看! 附上SortAnimate网站链接:http ...

  2. 秒杀9种排序算法(JavaScript版)

    一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...

  3. JavaScript实现的7种排序算法

    所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求 ...

  4. JavaScript十大经典排序算法

    排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...

  5. JavaScript的9大排序算法详解

    一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. ...

  6. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  7. 学习Java绝对要懂的,Java编程中最常用的几种排序算法!

    今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来!     ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...

  8. java算法03 - 常用的8种排序算法

    Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...

  9. 几种排序算法及Java实现排序的几种方式

    几种排序算法 下面的例子介绍了4种排序方法: 冒泡排序, 选择排序, 插入排序, 快速排序 package date201709.date20170915; public class SortUtil ...

随机推荐

  1. apache ignite系列(四):持久化

    ignite持久化与固化内存 1.持久化的机制 ignite持久化的关键点如下: ignite持久化可防止内存溢出导致数据丢失的情况: 持久化可以定制化配置,按需持久化; 持久化能解决在大量缓存数据情 ...

  2. Mysql优化总结(一)

    一,前言 ​ 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. ​ MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.My ...

  3. Windows(Win7)搭建RabbitMQ服务器

    首先安装Erlang环境,RabbitMQ的运行依赖于Erlang.可以在官网链接http://www.erlang.org/downloads 页面找到对应的开发环境安装包.例如64位Windows ...

  4. 跟我学SpringCloud | 第二十章:Spring Cloud 之 okhttp

    1. 什么是 okhttp ? okhttp 是由 square 公司开源的一个 http 客户端.在 Java 平台上,Java 标准库提供了 HttpURLConnection 类来支持 HTTP ...

  5. BeanFactory not initialized or already closed

    产生这个错误有两个可能, 一.你没有配置初始化文件,在web.xml中配置如下 <context-param> <param-name>contextConfigLocatio ...

  6. 数据结构与算法(C/C++版)【数组】

    第五章<数组> 一.概念 根据数组中存储的数据元素之间的逻辑关系,可以将数组分为 : 一维数组.二维数组.….n维数组.n维数组中,维数 n 的判断依据是:根据数组中为确定元素所在位置使用 ...

  7. 项目管理知识点-结合Enovia项目管理模块

    核心知识域:整体管理.范围管理.进度管理.成本管理.质量管理.信息安全管理 保障域:人力资源管理.合同管理.采购管理.风险管理.信息(文档)管理.配置管理.知识产权管理.法律法规标准规范管理.职业道德 ...

  8. Spring MVC 梳理 - handlerMapping和handlerAdapter分析

    参考图片 综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程 ①:获取Request的URL ②:从UrlLookup这个map中找到相应的requ ...

  9. linux 修改文件权限指令chmod

    chmod 修改一下bin目录下的.sh权限就可以了. chmod u+x *.sh 这里的u 这里指文件所有者,+x 添加可执行权限,*.sh表示所有的sh文件.

  10. .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关

    1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...