js常见算法

算法是一通百通的,不是学习java/js/c/c++算法就只能用在相应的语言,不同语言实现算法的方式是一样。

但是在前端使用算法,需要特别注意执行效率,就像使用js时能用条件运算符的地方就用它,就是因为条件运算符在前端执行效率远高于if,else判断。
1.排序算法
耳熟能详的算法应该就是“冒泡排序”和“快速排序”
//冒泡排序
function bubbleSort(arr){
    var i = j = 0;
    for(i=1;i
        for(j=0;j<=arr.length-i;j++){
            var temp = 0;
            if(arr[j]>arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}
//快速排序
function quickSort(arr,l,r){
    if(l < r){
        var i = l, j = r, x = arr[i];
        while(i
            while(i x)
                j--;
            
            if(i
                //这里用i++,被换过来的必然比x小,赋值后直接让i自加,不用再比较,可以提高效率
                arr[i++] = arr[j];
            
            while(i                 i++;
            
            if(i
                //这里用j--,被换过来的必然比x大,赋值后直接让j自减,不用再比较,可以提高效率
                arr[j--] = arr[i];
        }
        arr[i] = x;
        
        quickSort(arr, l, i-1);
        quickSort(arr, i+1, r);
    }
}
这两种算法在有关于产品的功能会经常使用,对产品种类的排序等。快速排序核心思想是分治法,优缺点都很明显,速度快省空间,但是比较脆弱,编写需要注意细节,而且当排序数组为“降序有序序列”时,快速排序基本就退化成一个冒泡排序了。

还有一种前端常用的是“二路并归”,将两个有序序列,合并为一个有序序列
function merge(left, right) {
    var result = [],
        il = 0,
        ir = 0;

    while (il < left.length && ir < right.length) {
        if (left[il] < right[ir]) {
            result.push(left[il++]);
        } else {
            result.push(right[ir++]);
        }
    }
    while(left[il]){
        result.push(left[il++]);
    }
    while(right[ir]){
        result.push(right[ir++]);
    }
    return result;
}
2.字符串操作
//判断回文字符串
function palindrome(str){
    // \W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
    var re = /[\W_]/g;
    // 将字符串变成小写字符,并干掉除字母数字外的字符
    var lowRegStr = str.toLowerCase().replace(re,'');
    // 如果字符串lowRegStr的length长度为0时,字符串即是palindrome
    if(lowRegStr.length===0)
        return true;
    // 如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome
    if(lowRegStr[0]!=lowRegStr[lowRegStr.length-1])
        return false;
    //递归
    return palindrome(lowRegStr.slice(1,lowRegStr.length-1));
}

//反转遍历字符串
function reverseString(str){
    var tmp = '';
    for(var i=str.length-1;i>=0;i--)
        tmp += str[i];
    return tmp
}

//生成指定长度字符串(随机码等)
function randomString(n){
    var str = 'abcdefghijklmnopqrstuvwxyz0123456789';
    var tmp = '';
    for(var i=0;i
        tmp += str.charAt(Math.round(Math.random()*str.length));
    return tmp;
}

//统计字符串中最多/最少的字母,本质是利用object,key值唯一进行计数
function findMaxDuplicateChar(str) {
    if(str.length == 1) {
        return str;
    }
    var charObj = {};
    for(var i = 0; i < str.length; i++) {
        if(!charObj[str.charAt(i)]) {
            charObj[str.charAt(i)] = 1;
        } else {
            charObj[str.charAt(i)] += 1;
        }
    }
    var maxChar = '',
        maxValue = 1;
    for(var k in charObj) {
        if(charObj[k] >= maxValue) {
            maxChar = k;
            maxValue = charObj[k];
        }
    }
    return maxChar + ':' + maxValue;
}

3.数组操作
//数组去重,利用object key唯一
function unique(arr){
    var obj = {}
    var data = []
    for(var i in arr){
        if(!obj[arr[i]]){
            obj[arr[i]] = true;
            data.push(arr[i]);
        }
    }
    return data;
}

//NUMBER数组中最大差值
function getMaxProfit(arr){
    var min = arr[0], max = arr[0];
    for(var i=0;i
        if(arr[i]
            min = arr[i];
        if(arr[i]>max)
            max = arr[i];
    }
    return max - min;
}

4.常用算法-二分查找
//非递归
function binary_search(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;
        }
    }
    return -1;
};
//递归
function binary_search2(arr, low, high, key) {
    if(low > high)
        return -1;
    var mid = parseInt((low + high)/2);
    if(key == arr[mid])
        return mid;
    else if(key > arr[mid])
        return binary_search2(arr, mid+1, high, key);
    else if(key < arr[mid])
        return binary_search2(arr, low, mid-1, key);
}
ps:使用算法时,应尽量减少递归的使用,递归的效率不高。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 常见算法可以通过JS来实现,下面是一些常见算法的汇总: 1. 排序算法JS常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法可以根据数组中的元素进行排序,最终得到有序的数组。 2. 查找算法:在JS中,常见的查找算法有线性查找和二分查找。线性查找从数组的第一个元素开始逐个比较,直到找到目标元素或遍历完整个数组。二分查找则是在有序数组中进行的,通过不断缩小查找范围来找到目标元素。 3. 图算法JS中可以使用邻接矩阵或邻接表来表示图的结构,并实现图算法常见的图算法包括广度优先搜索(BFS)和深度优先搜索(DFS),用于遍历图的所有节点,以及最短路径算法(如Dijkstra算法)和最小生成树算法(如Prim和Kruskal算法)等。 4. 字符串算法JS中的字符串算法包括字符串匹配算法和字符串处理算法常见的字符串匹配算法有KMP算法和Boyer-Moore算法,用于在字符串中寻找指定的模式。字符串处理算法包括字符串的反转、拼接、替换等操作。 5. 动态规划算法JS中可以通过递归或动态规划实现一些动态规划算法,如背包问题、最长公共子序列、最长递增子序列等。 6. 图形算法JS中可以使用canvas或SVG等技术来实现图形算法,如几何变换、线段相交判定、Convex Hull等。 以上是一些常见算法JS中的实现汇总,通过这些算法的掌握和实现,可以提高编程效率和解决实际问题的能力。 ### 回答2: 常见算法js实现的汇总可以包括以下几种算法: 1. 排序算法: - 冒泡排序:通过相邻元素的比较和交换来实现排序。 - 插入排序:将数组分为已排序和未排序两部分,每次从未排序中选择一个元素插入到已排序部分的正确位置。 - 选择排序:每次从未排序部分选择最小(或最大)的元素放到已排序部分的末尾。 - 快速排序:通过一次划分将数组分为两部分,并递归地对两部分进行排序。 2. 查找算法: - 顺序查找:逐个比较数组中的元素直到找到目标元素。 - 二分查找:将有序数组从中间划分,缩小查找范围,直到找到目标元素。 - 哈希查找:借助哈希表来实现高效的元素查找。 3. 图算法: - 深度优先搜索(DFS):以深度优先的方式遍历图的所有节点。 - 广度优先搜索(BFS):以广度优先的方式遍历图的所有节点。 - 最短路径算法:例如Dijkstra算法、Floyd-Warshall算法等用于寻找两个节点之间的最短路径。 4. 动态规划算法: - 最长公共子序列(LCS):用于寻找序列中的最长公共子序列。 - 背包问题:在给定一组物品和一定容量的背包下,选择物品使得总价值最大。 5. 搜索算法: - 回溯法:采用试错的思想,在遇到不能继续前进的情况时回退并尝试其他可能。 - 分支限界法:通过剪枝策略减少搜索空间,同时利用优先队列实现高效搜索。 以上仅是常见算法的一部分,在JavaScript中可以通过函数和数据结构来实现这些算法,并应用于实际问题的解决。 ### 回答3: 常见算法在JavaScript中有不同的实现方式,以下是其中一些常见算法及其在JavaScript中的实现汇总: 1. 冒泡排序:通过多次比较和交换相邻元素的位置,将最大(或最小)值逐步“冒泡”到数组的一端。实现代码如下: ```javascript function bubbleSort(arr) { for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; } ``` 2. 快速排序:通过选择一个基准元素,将数组分成两个子数组,在每次迭代中将小于基准的元素放在左边,大于基准的元素放在右边,然后对子数组递归地进行快速排序。实现代码如下: ```javascript function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivotIndex = Math.floor(arr.length / 2); const pivot = arr.splice(pivotIndex, 1)[0]; const left = []; const right = []; for (let i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return [...quickSort(left), pivot, ...quickSort(right)]; } ``` 3. 二分查找:在有序数组中查找特定元素的算法,通过将数组分成两部分,判断目标元素位于左侧还是右侧,然后递归地对目标部分进行查找。实现代码如下: ```javascript function binarySearch(arr, target) { let low = 0; let high = arr.length - 1; while (low <= high) { const mid = Math.floor((low + high) / 2); if (arr[mid] === target) { return mid; } else if (arr[mid] < target) { low = mid + 1; } else { high = mid - 1; } } return -1; } ``` 以上只是常见算法的一小部分,JavaScript有许多其他的实现方式和算法,根据具体的需求和使用场景选择适合的算法能够提高代码的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值