找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1900|回复: 0
打印 上一主题 下一主题
收起左侧

js算法之最常用的排序

[复制链接]
跳转到指定楼层
楼主
ID:140343 发表于 2016-9-25 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
引入
  大学学习计算机语言的那几年,从c语言,到c++,再到数据结构JAVA..让我印象最深刻的还是最开始老师讲冒泡算法的时候,直到现在大四快毕业了我才渐渐通窍了。刚学前端的时候以为前端就是做出好看很炫的页面就行了,后来才渐渐懂得前端不只是页面仔。一次美团面试,面试官说他们要的不仅是前端,他们要的是“工程师”,从面试开始到结束问都是算法,顿时把我给打击了。二叉树、基本算法还有时间复杂度都是很重要的东西,不仅体现了一个前端的学习深度,还体现了一名计算机学生的专业水平。所以,为了查缺补漏,我决定开始研究一下程序猿最爱提的算法,今天聊聊最常用的排序算法。鱿鱼看过很多资料觉得都太专业化了,根本看不懂,所以以下我都尽量用能让自己(别人)看懂的介绍来描述啦~
  1. 常用排序算法
  2. 冒泡排序(Bubble sort)
  3.     大白话介绍:比较相邻的两个数,如果后面的比前面的小,把小的放在前面。
  4.     时间复杂度:  O(n2)
  5.       动画演示:冒泡排序
  6.     实际代码:
  7. 方法一:function bubbleSort(arr){
  8.     for(var i=0;i<arr.length-1;i++){
  9.         for(var j=0;j<arr.length-1;j++){
  10.             if(arr[j+1]<arr[j]){  
  11.                 temp = arr[j+1];
  12.                 arr[j+1] = arr[j];
  13.                 arr[j] = temp;
  14.             }
  15.         }
  16.     }
  17.     return arr;
  18. }//对比arr中的第j+1项和第j项,如果第j+1项小于第j项,就把第j+1项和第j项调换位置。如果没达到最终的顺序(从小到大),就继续找,继续换,直到达到最终效果但是上面的方法并不完美,如果数组已经是有序了,就没必要再比较了,所以下面有一种优化冒泡排序算法:

  19. 优化冒泡排序算法
  20. 方法二(优化算法):function bubbleSort(arr){
  21.     var flag = false;  // 定义一个变量为false,未交换位置
  22.     for(var i=0;i<arr.length-1;i++){
  23.         for(var j=0;j<arr.length-1;j++){
  24.             if(arr[j+1]<arr[j]){
  25.                 temp = arr[j+1];
  26.                 arr[j+1] = arr[j];
  27.                 arr[j] = temp;
  28.                 flag = true; //true,已交换位置
  29.             }
  30.         }
  31.         if(flag){
  32.             flag = false; //如果交换了位置,将flag重新设为false
  33.         }else{
  34.              break;       //如果未交换,则跳出循环
  35.         }
  36.     }
  37.     return arr;
  38. }或者写成这样~function bubbleSort(arr){
  39.     var flag;
  40.     for(var i=0;i<arr.length-1;i++){
  41.         flag =false;
  42.         for(var j=0;j<arr.length-1;j++){
  43.             if(arr[j+1]<arr[j]){
  44.                 temp = arr[j+1];
  45.                 arr[j+1] = arr[j];
  46.                 arr[j] = temp;
  47.                 flag = true;
  48.             }
  49.         }
  50.         if(!flag){
  51.             return arr;
  52.         }
  53.     }
  54.     return arr;
  55. }
  56. 选择排序(selection Sort)
  57.     大白话介绍:在乱序的数组中选择最小的值,然后和每次循环后的数组的第一位进行交换
  58.     时间复杂度:O(n2)
  59.       动画演示:选择排序
  60.     实际代码:  
  61. var arr=[5,3,2,4,1,0];function findMin(arr,first){
  62.         var minindex = first;  //定义最小下标
  63.         var minNum = arr[first]; //定义数组中的最小值
  64.         for(var i=first+1;i<arr.length;i++){ //循环找到最小值和最小下标
  65.             if(arr[i]<minNum){
  66.                 minNum = arr[i];
  67.                 minindex = i;
  68.             }
  69.         }
  70.         return minindex;//返回最小值下标  一共查找了六次,最小值下标分别为 :5,4,2,4,4,5
  71.     }
  72.     function selectionSort(arr){
  73.         for(var i=0;i<arr.length;i++){
  74.             var min =var temp = arr[min];     
  75.             arr[min] = arr[i];         //eg.第一次循环 :将最小值5和arr[0]进行交换
  76.             arr[i] = temp;             // 剩下几次同第一次
  77.         }
  78.         return arr;
  79.     }
  80.     document.write(selectionSort(arr));  //0,1,2,3,4,5,     排序过程:(自己画的一个粗糙的框框表嫌弃)

  81.       

  82. 归并排序(mergeSort)
  83.     大白话介绍:   把一个数组分为两个数组,左边排好序,右边排好序,然后合并到一起排序
  84.       专业性介绍:   归并排序是分治法的典型实例,指的是将两个已经排序的序列合并成一个序列的操作
  85.     时间复杂度:   O(nlogn)
  86.     动画演示:归并排序
  87.     实际代码:
  88.      var arr=[-11,17,12,19,0,-222];
  89.      function mergeSort(arr,s,e){
  90.          if(s>e){   //起始位置大于终点位置,返回空数组
  91.              return [];
  92.          }else if(s==e){
  93.              return [arr[s]]; //起始位置等于终点位置,说明数组里只有一个数字,返回只含一个数字的数组   
  94.          }
  95.          var mIndex = Math.floor((s+e)/2); //中间位置的Index
  96.          var arrL = mergeSort(arr,s,mIndex); //将左边的数组排序
  97.          var arrR = mergeSort(arr,mIndex+1,e); //将右边的数组排序
  98.         
  99.          var resultArr = []; //结果数组
  100.          while(arrL.length>0 || arrR.length>0){ //当左右两个数组都不为空时
  101.              if(arrL[0]<arrR[0]){
  102.                  resultArr.push(arrL.shift());
  103.              }else{
  104.                  resultArr.push(arrR.shift());
  105.              }
  106.              if(arrL.length==0){  //当左边的数组为空时
  107.                  resultArr = resultArr.concat(arrR);
  108.                  break;
  109.              }else if(arrR.length==0){
  110.                  resultArr = resultArr.concat(arrL);
  111.                  break;
  112.              }
  113.          }
  114.          return resultArr;
  115.      }
  116.      document.write(mergeSort(arr,0,arr.length-1));  排序过程:
  117.    

  118. 快速排序(quickSort)
  119.   大白话介绍:引用阮一峰老师的一句话,感觉是极好理解的~(我的目标也是成为像阮一峰老师这样的)
  120.  (1)在数据集之中,选择一个元素作为"基准"(pivot)。
  121.  (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
  122.  (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。      实际代码:
  123.     var arr=[77,-33,22,32,0,2,11];
  124.     function quickSort(arr){
  125.         if(arr.length<=1){ //如果数组中只有一位数,返回数组
  126.             return arr;
  127.         }
  128.         var mNumIndex = Math.floor(arr.length/2); //取基准值的下标
  129.         var mNum = arr.splice([mNumIndex],1)[0];  //取基准值
  130.         var left = [];  //左边数组
  131.         var right = []; //右边数组
  132.       
  133.         for(var i=0;i<arr.length;i++){
  134.             if(arr[i]<mNum){  //如果数组小于基准值,放在左边数组
  135.                 left.push(arr[i]);
  136.             }else{            ///否则
  137.                 right.push(arr[i]);
  138.             }
  139.         }      
  140.         return quickSort(left).concat([mNum],quickSort(right)); //返回左边数组+基准值+右边数组
  141.     }
  142.     document.write(quickSort(arr));  排序过程:
复制代码



      以上就是一些常见的排序了,但是还有很多常见的排序没有提到~~ 后期还会写一个常用排序二~敬请期待噢 ~希望我学到的东西也能帮助到大家~有说错的地方欢迎批评指正~

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表