JS几种常见算法

一、冒泡排序

1.1 冒泡排序原理
  • 1、比较相邻的两个元素,如果前一个比后一个大,则交换位置。
  • 2、第一轮的时候最后一个元素应该是最大的一个。
  • 3、按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。
1.2 冒泡排序实例
var exampleArr = [8, 94, 15, 88, 55, 76, 21, 39];
function sortArrByBubble(arr) {
    for (i = 0; i < arr.length - 1; i++) {
        for (j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
}
sortArrByBubble(exampleArr);
console.log(exampleArr);
复制代码

二、二路归并排序

2.1、 二路归并排序原理
  • 二路归并排序主要运用了“分治算法”。
  • 分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题。
  • 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。
2.2、 二路归并的理解

二路归并排序主旨是“分解”与“归并”

分解:  

  • 1、将一个数组分成两个数组,分别对两个数组进行排序。

  • 2、循环第一步,直到划分出来的“小数组”只包含一个元素,只有一个元素的数组默认为已经排好序。

归并:

  • 1.将两个有序的数组合并到一个大的数组中。
  • 2.从最小的只包含一个元素的数组开始两两合并。此时,合并好的数组也是有序的
2.3 二路归并的理解

2.4 二路归并实例
function mergeSort(arr) {
    // 设置终止的条件,
    if (arr.length < 2) {
        return arr;
    }
    //设立中间值
    var middle = parseInt(arr.length / 2);
    //第1个和middle个之间为左子列
    var left = arr.slice(0, middle);
    //第middle+1到最后为右子列
    var right = arr.slice(middle);
    if (left == "undefined" && right == "undefined") {
        return false;
    }
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    var result = [];

    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            //把left的左子树推出一个,然后push进result数组里
            result.push(left.shift());
        } else {
            //把right的右子树推出一个,然后push进result数组里
            result.push(right.shift());
        }
    }
    //经过上面一次循环,只能左子列或右子列一个不为空,或者都为空
    while (left.length) {
        result.push(left.shift());
    }
    while (right.length) {
        result.push(right.shift());
    }
    return result;
}
// 测试数据
var nums = [6, 1, 4, 8, 2, 7, 3, 5];
console.log(mergeSort(nums))
复制代码

三、斐波那契数列

3.1 斐波那契数列
  • 斐波那契数列(Fibonaccisequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”
  • 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
  • 在数学上,斐波纳契数列以如下被以递归的方法定义:
  • F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>2,n∈N*)
3.2 斐波那契数列 实例
function Fibonacci(n) {
    if (n <= 1) {
        return 1
    }
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}
console.log(Fibonacci(8))

// 输出结果34
复制代码

四、二分查找

4.1、什么是二分查找

二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。 查找过程可以分为以下步骤:

  • 1、首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步。
  • 2、如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半区域查找,然后重复第一步的操作。
  • 3、如果某一步数组为空,则表示找不到目标元素。
4.2、二分查找实例

非递归算法

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 44, 86];

function binarySearch(arr, key) {
    var low = 0,
        high = arr.length - 1;
    while (low <= high) {
        var mid = parseInt((high + low) / 2);
        if (key == arr[mid]) {
            return mid;
        } else if (key > arr[mid]) {
            low = mid + 1;
        } else if (key < arr[mid]) {
            high = mid - 1;
        } else {
            return -1;
        }
    }
};
var result = binarySearch(arr, 10);
console.log(result); // 9 返回目标元素的索引值   

复制代码

递归算法

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 44, 86];

function binarySearch(arr, low, high, key) {
    if (low > high) {
        return -1;
    }
    var mid = parseInt((high + low) / 2);
    if (arr[mid] == key) {
        return mid;
    } else if (arr[mid] > key) {
        high = mid - 1;
        return binarySearch(arr, low, high, key);
    } else if (arr[mid] < key) {
        low = mid + 1;
        return binarySearch(arr, low, high, key);
    }
};

var result = binarySearch(arr, 0, 13, 10);
console.log(result); // 9 返回目标元素的索引值
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值