每种编程语言学到数组的时候,都会讲到排序算法,当时学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代码实现:

  1. function bubbleSort(arr){
  2. for(var r=1;r<arr.length;r++){
  3. for(var i=0;i<arr.length-r;i++){
  4. if(arr[i]>arr[i+1]){
  5. var temp=arr[i];
  6. arr[i]=arr[i+1];
  7. arr[i+1]=temp;
  8. }
  9. }
  10. }
  11. return arr;
  12. }
  13. var arr=[2,4,3,1,5];
  14. arr=bubbleSort(arr);
  15. 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代码实现:

  1. var arr=[2,4,3,5,1];
  2. //插入排序
  3. function insertSort(arr){
  4. for(var i=1;i<arr.length;i++){
  5. var t=arr[i];
  6. var p=i-1;
  7. while(t<arr[p]&&p>=0){
  8. arr[p+1]=arr[p];
  9. p--;
  10. }
  11. arr[p+1]=t;
  12. }
  13. }
  14. insertSort(arr);
  15. 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代码实现:

  1. var arr=[2,4,3,5,1];
  2. function quickSort(arr){
  3. if(arr.length<=1){
  4. return arr;
  5. }
  6. else{
  7. var c=arr.splice(Math.floor(arr.length/2),1)[0];
  8. var left=[],right=[];
  9. for(var i=0;i<arr.length;i++){
  10. if(arr[i]>c){right.push(arr[i])}
  11. else{left.push(arr[i])}
  12. }
  13. return quickSort(left).concat(c,quickSort(right));
  14. }
  15. }
  16. arr=quickSort(arr);
  17. 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. poj 1328 贪心

    /* 贪心.... 处理处每个点按照最大距离在x轴上的映射 然后我们就有了一些线段 目的是选取尽量少的点 使得每个线段内都有点出现 我们按照左端点排序 然后逐一处理 假设第一个雷达安在第一个线段的右端 ...

  2. poj 1595

    #include <iostream> #define N 10010 using namespace std; int a[N],b[N]; int prime(int a) { int ...

  3. 执行CMD命令

    可以执行多条命令,用“\r\n”分割 using System; using System.Diagnostics; namespace Tool { public class CMDHelper { ...

  4. 关于android:screenOrientation="portrait"等

    1.android:screenOrientation="portrait",表示当切换横竖屏的时候,屏幕的内容始终以竖屏显示,而不会根据屏幕的方向来显示内容. 2.插入个Andr ...

  5. javascript 更改控件的class.

    指定 className即可, 如通过id,可这样更改: document.getElementById("myDIV").className = "calssName& ...

  6. JAVA打印类(带预览)

    package tool; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; ...

  7. Gradle一分钟实现Spring-MVC

    前提: 1,已安装JDK 2, 有Intellij IDEA 3, 已安装Gradle 一分钟实现步骤: 1,mkdir Spring-MVC;cd Spring-MVC2,gradle init3, ...

  8. dede去除powered by dedecms

    include/dedesql.classs.php文件中找到第588行: $arrs1 = array(0x63,0x66,0x67,0x5f,0x70,0x6f,0x77,0x65,0x72,0x ...

  9. WordPress插件制作笔记(一)---First Plugins Demo

    1->add_action  HOOK简单说明: http://codex.wordpress.org/Plugin_API/Action_Reference (参考网址) //在后台页脚位置加 ...

  10. HAPROXY 配置项/配置实例

    HAPROXY 配置项/实例 常用配置选项: OPTION 选项: option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时 ...