1、冒泡排序

function bubbleSort(arr,order){
let len = arr.length-1,flag=true
for(let i=0;(i<len)&&flag;i++){
flag=false
for(let j=0;j<len-i;j++){
if((arr[j]-arr[j+1])*order>0){
flag=true
let tran = arr[j]
arr[j]=arr[j+1]
arr[j+1]=tran
}
}
}
}
let arr=[2,3,0,5,1,6,8,4]
bubbleSort(arr,1)
console.log(arr)

2、插入排序

function insertSort(arr){
let len=arr.length-1
for(let i=1;i<len;i++){
let currrent=arr[i],j
for(j=i-1;j>=0&&arr[j]>currrent;j--){
arr[j+1]=arr[j]
}
arr[j+1]=currrent
}
}
let arr=[2,3,0,5,1,6,-6,4]
insertSort(arr)
console.log(arr)

3、快速排序

function quickSort(arr,low,high){
if(low>high) return
let mid=partition(arr,low,high)
quickSort(arr,low,mid-1)
quickSort(arr,mid+1,high)
}
function partition(arr,low,high){
for(i=low,j=low;j<high;j++){
if(arr[j]<arr[high]){
swap(arr,i++,j)
}
}
swap(arr,i,j)
return i
}
function swap(arr,i,j){
let tran=arr[i]
arr[i]=arr[j]
arr[j]=tran
}
let arr=[2,3,0,5,1,6,8,4]
quickSort(arr,0,arr.length-1)
console.log(arr)

4、归并排序

function mergeSort(arr,low,high){
if(low>=high) return
let mid = Math.floor((low+high)/2)
mergeSort(arr,low,mid)
mergeSort(arr,mid+1,high)
merge(arr,low,mid,high)
}
function merge(arr,low,mid,high){
let k=low,i=low,j=mid+1
let copy=[...arr]
while(k<=high){
if(i>mid){
arr[k++]=copy[j++]
}else if(j>high){
arr[k++]=copy[i++]
}else if(copy[i]>copy[j]){
arr[k++]=copy[j++]
}else {
arr[k++]=copy[i++]
}
}
}
let arr=[2,3,0,5,1,6,8,4]
mergeSort(arr,0,arr.length-1)
console.log(arr)

5、堆排序

function heapify(arr,i,high){
if(i>=high) return
let left=2*i+1
let right =2*i+2
let max=i
if((left<high)&&(arr[max]<arr[left])) max =left
if((right<high)&&(arr[max]<arr[right])) max =right
if(i!=max){
swap(arr,i,max)
heapify(arr,max,high)
}
}
function buildHeap(arr){
let high = arr.length
for(let m=Math.floor(high/2);m>=0;m--){
heapify(arr,m,high)
}
}
function heapSort(arr){
buildHeap(arr)
let high=arr.length
let j=high-1
for(let i=0;i<high;i++){
swap(arr,0,j)
heapify(arr,0,j--)
}
}
function swap(arr,i,j){
let tran = arr[i]
arr[i]= arr[j]
arr[j]= tran
}
arr=[2,-1,7,6,5,12]
heapSort(arr)
console.log(arr)

6、原生排序

function sort(arr,order){
arr.sort((a,b)=>{
return (a-b)*order
})
}
let arr=[2,3,0,5,1,6,8,4]
sort(arr,-1)
console.log(arr)

不同条件下,排序方法的选择

(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
    当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
    快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
    堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
    若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的  排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,         然后再两两归并之。因为直接插入排序是稳定 的,所以改进后的归并排序仍是稳定的。

参考:

《算法设计指南》,Skiena

https://kaiwu.lagou.com/course/courseInfo.htm?courseId=3#/detail/pc?id=31

堆排序:https://www.bilibili.com/video/BV1Eb41147dK?from=search&seid=5680730895913351029

排序算法 | JS的更多相关文章

  1. 八大排序算法JS及PHP代码实现

    从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以 ...

  2. 分析并封装排序算法(js,java)

    前言 本次来分享一下排序的api底层的逻辑,这次用js模拟,java的逻辑也是差不多. 先看封装好的api例子: js的sort排序 java的compareTo排序 自己模拟的代码(JS) func ...

  3. 十大经典排序算法-JS篇

    http://web.jobbole.com/87968/ 虽然是JS篇,但其他编程语言(例如java)实现起来是差不多的.

  4. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  5. http://www.html5tricks.com/demo/jiaoben2255/index.html 排序算法jquery演示源代码

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...

  6. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

  7. JS写的排序算法演示

    看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...

  8. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  9. 常见排序算法基于JS的实现

    一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...

  10. JS家的排序算法

    由于浏览器的原生支持(无需安装任何插件),用JS来学习数据结构和算法也许比c更加便捷些.因为只需一个浏览器就能啪啪啪的调试了.比如下图我学习归并排序算法时,只看代码感觉怎么都理解不了,但是结合chro ...

随机推荐

  1. Centos 6.5 iptables 端口白名单设置

    iptables -I INPUT -p tcp --dport 8888 -j DROPiptables -I INPUT -s 10.9.145.101 -p tcp --dport 8888 - ...

  2. 两张表合并到一个VO里面

    @Overridepublic List<TbRemouldAirELe> findAll() { List<TbRemouldAirELe> list = new Array ...

  3. 数据库多表连接查询中使用group by分组语句,Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXX' which is not functionally dependent on columns in GROUP BY claus

    需求描述: 要是用两表联合查询,并对查询的结果进行分组:sql如下: 1 SELECT 2 a.`id`, 3 a.`fr_num`, 4 b.`ent_status` 5 FROM 6 `table ...

  4. 0627.selenium请求库*2

    昨天已经介绍了关于selenium的简单基本基本使用--通过两种方式自动打开和关闭谷歌浏览器今天,我们将介绍的模块将是在昨天打开谷歌浏览器的基础上,打开某一个电商平台,并搜索某一个产品,利用前面学的知 ...

  5. 报错:cannot import name ‘escape’ from ‘jinja2’

    jinja2版本问题导致 解决方法: 降低版本即可 pip3 install Jinja2==3.0.3 -U pip3 install werkzeug==2.0.3 -U jinja2介绍 jin ...

  6. cookie,session,token,drf-jwt

    1.cookie,session,token发展史 引入:我们都知道 http 协议本身是一种无状态的协议,一个普通的http请求简单分为三步:客户端发送请求request服务端收到请求并进行处理服务 ...

  7. Appium-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)

    文章转自:https://www.cnblogs.com/lfr0123/p/13679568.html swipe一般用于对页面进行上下左右滑动操作,但自动化过程中还会遇到其他情况,如对控件元素进行 ...

  8. GUI程序设计——班级信息收集系

    import pymysql import wx class MyFrame(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(se ...

  9. gcc_to_use

    gcc 目录 gcc 概要 基本指令及功能(以gcc为例) gcc -gdb gcc -cmake 概要 GCC:GNU Compiler Collection(GUN 编译器集合),是GNU项目中符 ...

  10. Keil5 STM32 C++开发 ARM V6编译器的使用教程

    Keil5更新之后,开始支持ARM V6编译器,新版本的编译器对C++有了更多的支持,在编译方面也做了很多的改善,具体的没有详细了解,本文只是对STM32 开发下,使用V6版本的编译器进行STM32的 ...