美文网首页
算法排序

算法排序

作者: 田成力 | 来源:发表于2019-10-14 19:06 被阅读0次

算法

冒泡排序

冒泡排序:小的往前排,打的往后排,实现从小到大。
两两比较,若前一项比后面一项小则保持排列位置,若前一项比后一项大,交换位置。

// 注释的写法的规范写法:

// bubble:冒泡排序
//  @parameter
//    ary:[array]需要实现排序的数组
//  @return
//    [array]排序后的数组(升序)
// by team on 2018/02/02

function bubble(ary) {
    //->外层循环控制的是比较的轮数
    for (var i = 0; i < ary.length - 1; i++) {
        //->里层循环控制每一轮比较的次数
        for (var j = 0; j < ary.length - 1 - i; j++) {
            //ary[j]:当前本次拿出来这一项
            //ary[j+1]:当前项的后一项
            if (ary[j] > ary[j + 1]) {
                //->当前这一项比后一项还要大,我们让两者交换位置
                var temp = ary[j];
                ary[j] = ary[j + 1];
                ary[j + 1] = temp;
            }
        }
    }
    return ary;
}
var ary = [12, 13, 23, 14, 16, 11];
console.log(bubble(ary));

递归

(函数自己调用自己)


function fn(num) {
    console.log(num);
    if(num ==0){
        return;
    }
    fn(num - 1);
}
fn(10);


//=>需求:1~10以内的所有偶数乘积
function fn(num) {
    if (num <= 1) {
        return 1;
    }
    if (num % 2 === 0) {
        return num * fn(num - 1);
    }
    return fn(num - 1);
}
var result = fn(10);
console.log(result);

求1一直加到100之间和?
 function sum(n){
        if(n ==1){//调用边界
            return 1;
        }
        return n+sum(n-1) //在return后再执行方法本身
    }
   var result = sum(100);
    console.log(result);
   /*100+sum(99)
   100+99+sum(98)
    100+99+98+sum(97)
              //....
    100+99+98+...+1*/

   //求1到10之间奇数之和  1,3,5,7
    function fn(n){
        if(n==1){
            return 1;
        }
        if(n%2==0){
            return fn(n-1)
        }else{
            return n+fn(n-2)  //不断调用fn的逻辑,这时可以在return 后面返回函数执行,再次调用方法本身
        }
    }

面试题:1~100之间,把所有能被3并且能被5整除的获取到,然后累加求和

//=> 方案一:
var total = null;
for (var i = 0; i <= 100; i++) {
    if (i % 3 == 0 && i % 5 == 0) {
       total += i;
    }
}
console.log(total); //315

//=>方案二:
function fn(num) {
    if (num > 100) {
        return 0
    }
    if (num % 15 == 0) {
        return num + fn(num + 1);
    }
    return fn(num + 1)
}
var res = fn(1);
console.log(res);

快速排序

原理:先找中间项,把剩余项中的每一个值和中间项进行比较,比他小的放在左边(新数组),比他大的放在右边(新数组);

function quick(ary) {
    //->如果传递进来的数组只有一项或者是空的,我们则不再继续取中间项拆分
    if (ary.length <= 1) {
        return ary;
    }

    //->获取中间项的索引:把中间项的值获取到,在原有数组中删除中间项
    var centerIndex = Math.floor(ary.length / 2),
        centerValue = ary.splice(centerIndex, 1)[0];//->splice返回的是个数组,数组中包含了删除的那个内容值,把内容值获取到;

    //->用剩余数组中的每一项和中间项进行比较,比中间项大的放在右边,比他小的放在左边(左右两边都是新数组)
    var aryLeft = [],
        aryRight = [];
    for (var i = 0; i < ary.length; i++) {
        var cur = ary[i];
        cur < centerValue ? aryLeft.push(cur) : aryRight.push(cur);
    }
    return quick(aryLeft).concat(centerValue, quick(aryRight));
}
console.log(quick([12, 15, 14, 13, 16, 11]));


  var ary = [3,65,7,12,56];
  
  function quickSort(ary) {
       if(ary.length<=1){
           return ary;
       }
        var pointIndex=Math.floor(ary.length/2);
       var pointValue=ary.splice(pointIndex,1)[0];
       var left=[];
       var right=[];
       for (var i = 0;i<ary.length;i++) {
           var cur= ary[i];
           if(cur<=pointValue){
               left.push(cur)
           }else {
               right.push(cur)
           }
       }
return quickSort(left).concat(pointValue,quickSort(right));
   }

    console.log(quickSort(ary));

插入排序

//倒序
function insert(ary) {
    //->先抓一张牌(一般都抓第一张)
    var handAry = [];//->存储的是手里已经抓取的牌
    handAry.push(ary[0]);

    //->依次循环抓取后面的牌
    for (var i = 1; i < ary.length; i++) {
        var item = ary[i];//->本次新抓的这张牌

        //->拿新抓的牌和手里现有的牌比较
        for (var j = handAry.length - 1; j >= 0; j--) {
            //handAry[j]:当前比较的手里的这张牌
            //->新抓的牌比当前比较的这张牌大了,我们把新抓的牌放在它的后面
            if (item > handAry[j]) {
                handAry.splice(j + 1, 0, item);
                break;
            }
            if (j === 0) {
                //->新抓的牌是最小的,我们把新抓的牌放在最开始的位置
                handAry.unshift(item);
            }
        }
    }
    return handAry;
}
console.log(insert([1, 2, 3, 2, 1, 2, 3, 4, 5, 23, 34, 4]));
//从左到右插入排序
<script>
    //left 从小到大排列
    var ary = [5, 8, 10, 35, 3, 9],
        left = ary.splice(0, 1);//删除的这一项放入一个新数组里返回[5]
    for (var i = 0; i < ary.length; i++) {//依次把原有数组中的内容拿出来
        var curR = ary[i];
        for (var j = 0; j < left.length;) {//顺着和左手的牌依次进行比较
            if (curR <= left[j]) {
                left.splice(j, 0, curR);
                break;
            } else {
                j++;
                if (j == left.length) {
                    left.push(curR);
                    break;
                }
            }
        }
    }
    console.log(left);
</script>

9*9乘法表

<style>
ul li{
    list-style: none;
}
ul li span{
    display: inline-block;
    width: 100px;
    height: 40px;
    line-height: 40px;
    border:1px solid #333;
    text-align: center;}
    </style>
</head>
<body>
<ul id="list"></ul>
<script type="text/javascript">
var oUl=document.getElementById("list");
var str="";
for (var i = 1; i<=9; i++) {
str +="<li>";
    for (var j = 1; j <=i; j++) {
str+=j+"*"+i+"="+j*i+"&nbsp;";

    }
    str+="</li>"
}
oUl.innerHTML=str;
</script>

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:算法排序

      本文链接:https://www.haomeiwen.com/subject/dhqxmctx.html