每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法。今天来总结一下javascript中如何实现三种排序算法。

1.冒泡排序(默认升序排列哦)

  原理:

  冒泡排序的原理,顾名思义,就是小数往上冒,大数往下沉。从第一个数开始,如果比第二个数大就交换位置,然后跟第三个数字进行比较大小,交换位置等。

  举例一下,有数组[2,4,3,5,1]

  第一次循环:2<4  不交换;4>3 交换;4<5不交换;5>1交换,故结果是[2,3,4,1,5];

  第二次循环:2<3,3<4不交换;4>1交换,4<5不交换,故结果是[2,3,1,4,5]

  同理:

  第三次循环:结果是[2,1,3,4,5]

  第四次循环:结果是[1,2,3,4,5]

  javascript代码实现:

function bubbleSort(arr){
for(var r=1;r<arr.length;r++){
for(var i=0;i<arr.length-r;i++){
if(arr[i]>arr[i+1]){
var temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
}
return arr;
}
var arr=[2,4,3,1,5];
arr=bubbleSort(arr);
console.log(arr);//[1,2,3,4,5]

2.插入排序(默认升序)

  原理:

  默认第一个数字最小,然后取出第二个数字进行插入,如果第二个数字小于第一个数字,则第一个数字后移一位,第二个数字放到第一个位置。然后取出第三个数字,从第一个位置开始比较插入,直到最后一个数字。

  举例:有一个数组[2,4,3,5,1]

  第一次插入:2<4不插入,结果为[2,4,3,5,1]

  第二次插入:3>2,2不后移,3<4,4后移一位,3插入,结果为[2,3,4,5,1]

  同理:

  第三次插入:结果为[2,3,4,5,1]

  第四次插入:结果为[1,2,3,4,5]

  javascript代码实现:

var arr=[2,4,3,5,1];
//插入排序
function insertSort(arr){
for(var i=1;i<arr.length;i++){
var t=arr[i];
var p=i-1;
while(t<arr[p]&&p>=0){
arr[p+1]=arr[p];
p--;
}
arr[p+1]=t;
}
}
insertSort(arr);
console.log(arr);//[1,2,3,4,5]

3.快速排序(默认升序排列)

  原理:

  取数组中间的元素,大于中间元素的放到right数组中,小于中间元素的放到left数组中,一次递归,直至每个left和right中元素为空或只为一个元素的时候停止。最后拼接子数组即可。

  举例:现有一数组[2,4,3,5,1]

  第一次排序:left=[2,1]                                                             middle=[3]                               right=[4,5]

  第二次排序:left.left=[]    left.middle=[1]  left.right=[2]             middle=[3]          right.left=[4]   right.middle=[5]    right.right=[]

  拼接即可得:[1,2,3,4,5]

  javascript代码实现:

var arr=[2,4,3,5,1];
function quickSort(arr){
if(arr.length<=1){
return arr;
}
else{
var c=arr.splice(Math.floor(arr.length/2),1)[0];
var left=[],right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]>c){right.push(arr[i])}
else{left.push(arr[i])}
}
return quickSort(left).concat(c,quickSort(right));
}
}
arr=quickSort(arr);
console.log(arr);

  三种排序算法如上了,如果对比之下,冒泡排序的复杂度是O(n^2),插入排序复杂度是O(1),快速排序复杂度是O(n*log(n))。

  算法讲述如有不对,希望批评指正~

JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)的更多相关文章

  1. Javascript作用域学习笔记(三)

    看完<你不知道的javascript>上,对作用域的新的理解(2018-9-25更) 一.学习笔记:   1.javascript中的作用域和作用域链 +  每个函数在被调用时都会创建一个 ...

  2. JavaScript新手学习笔记(一)

    1.JavaScript 对大小写敏感. JavaScript 对大小写是敏感的. 当编写 JavaScript 语句时,请留意是否关闭大小写切换键. 函数 getElementById 与 getE ...

  3. JavaScript新手学习笔记1——数组

    今天,我复习了一下JavaScript的数组相关的知识,总结一下数组的API: 总共有11个API:按照学习的先后顺序来吧,分别是: ① toString()  语法:arr.toString(); ...

  4. MySQL学习笔记:三种组内排序方法

    由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行 ...

  5. Javascript MVC 学习笔记(三) 视图和模板

    模板 Javascript中模板的核心概念是,将包括模板变量的HTML片段和Javascript对象做合并.把模板变量替换为对象中的属性值. 书中讲到了几种库作为模板引擎,可是链接失效了.能够在这里下 ...

  6. JavaScript新手学习笔记4——我记不住的几个坑:短路逻辑、按值传递、声明提前

    1.短路逻辑 逻辑运算中,如果前一个条件已经可以得出最终结论,则后续所有条件不再执行!这里的逻辑运算指的是逻辑与和逻辑或. 我们要理解逻辑与是两个条件都为真的时候,才为真,如果第一个就是假的,那么后面 ...

  7. ANDROID_MARS学习笔记_S02_008_ANIMATION第二种使用方式:xml

    一.简介 二.代码1.res\anim下的xml(1)alpha.xml.xml <?xml version="1.0" encoding="utf-8" ...

  8. ANDROID_MARS学习笔记_S02_007_Animation第一种使用方式:代码

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  9. 【JS面试向】选择排序、桶排序、冒泡排序和快速排序简介

    新年伊始,又到了金三银四的时候了.面对前端越来越多的算法面试题,我简单的整理了一下几种比较常见的数组排序方式,分别介绍其基本原理和优劣势.(ps:才疏学浅,希望大家可以在issues下面指出问题) 选 ...

随机推荐

  1. return;,return false,return true----------浅析

    作为新手,一直没注意他们的区别,今天特意在网上搜了搜. 1: retuen; 无返回值,表示终止函数往下执行 2: return true; a.返回 bool值 真 b.提交表单 针对<but ...

  2. form表单提交

    1.form表单提交.html页面失败 <%--客户端form--%> <form id="form2" action="LoginOne.html&q ...

  3. Nagios设置只监控不报警

    设置全部监控项都开启邮件报警: vim /usr/local/nagios/etc/nagios.cfg 设置 enable_notifications=1    1为开启,0为关闭     如个别监 ...

  4. Dapper基本增删改查

    说明: 1.在using语句块中不用dbConnection.Open(),因为Execute方法中会Open,并且在执行完成会Close. 2.在Ado.Net中要手动Open,在Using语句块中 ...

  5. C#之重定向输入输出

    当我们写完程序,想要在另一个平台上跑我们所写的程序的时候,就需要用到重定向输入输出. 重定向有两中方式,即同步和异步. 下面来讲讲同步 代码: Process process = new Proces ...

  6. 武汉科技大学ACM:1005: 华科版C语言程序设计教程(第二版)例题5.8

    Problem Description 老师给小豪出了一道题目:给你两个整数x和n(-10<=x<=10,1<=n<=10),让你求出x^1+x^2+x^3+……+x^n的结果 ...

  7. 《Linux内核分析》 week2作业-时间片轮转

    一.基于时间片轮转调度代码的解读 代码结构主要由三个文件组成: 1.mypcb.h 2.myinterrupt.c 3.mymain.c 1.进程控制块(mypcb.h) /* CPU-specifi ...

  8. rails 中 create, new, build, save 的用法以及误区汇总

    自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的create,new,build等方法不是很了解,用的很混乱,导致经常出现不必要的bug,很苦恼,决定,总结一下,结合网上已有资源 ...

  9. Jquery 学习插件第一天

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  10. IE10的bug?disabled button如何触发事件

    最近碰到一个问题,IE10下的,貌似是个bug,求助! 问题表现为:在内部有dom元素的情况下,disabled状态的button会因为子元素的mouseover产生事件冒泡而触发,也就是说,disa ...