常见排序及查找算法的JS实现

1.冒泡排序

function bubbleSort(arr) {
            var temp;                                //临时交换变量
            let n = arr.length;                      //记录数组长度
            let count=0;                             //计数,记录一共进行了多少次交换
            //document.write('数组长度为:'+n+'<br />') //输出数组成都
            for (let i=0; i<n; i++) {                 //外层循环,排序出数组的arr[i]的值
                    
                let flag=0;                           //交换标志
                for (let j=n-1; j>i; j-- ) {        //内层循环,从底往上冒泡,将小泡浮到arr[i]位置
                    //alert(0);
                    if (arr[j-1]>arr[j]) {           //比较两个元素大小,并交换位置
                        temp=arr[j-1];
                        arr[j-1]=arr[j];
                        arr[j]=temp;
                        flag=flag+1;                 //确定交换标志
                        count=count+1;               //记录比较元素的次数             
                        //console.log(flag);           
                        //console.log('共交换了:'+count+'次');
                    }
                    //console.log(arr)                 //输出数组
                }
                if (flag==0) {                   //跳出循环
                    break;
                }
            }
            document.write('冒泡排序执行次数为:'+count+'<br />')
            return arr;                              //返回数组
        }

2.简单选择排序

function selectSort(arr) {
        let temp;
        let n = arr.length;
        let count =0;
        for (let i=0; i<n; i++) {
            for (let j= i+1; j<n; j++) {
                count++;
                if (arr[j]<arr[i]) {
                    temp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = temp;
                    
                }
            }
        }
        document.write('简单选择排序执行次数为:'+count);
        return arr;
}

3.直接插入排序

function insertSort(arr) {
        let i,j;
        let n= arr.length;
        let count = 0;
        for (i=1; i<n; i++) {
            if (arr[i]<arr[i-1]) {
                arr[-1] = arr[i];                  //将i位置的值给哨兵            
                for (j=i-1; arr[j]>arr[-1];j--) {  //当i位置前面的值比哨兵小,后移i位置的值,并插入哨兵到原先i位置
                    arr[j+1] = arr[j];
                    arr[j] = arr[-1];
                    count++;
                }
            }
        }
    document.write('直接插入排序执行次数为:'+count);
    return arr;
}

4.希尔排序

function shellSort(arr) {
     let d = arr.length;
     let i;
     let temp; //暂存
     do {
        //设置增量
       d = Math.floor(d / 3) + 1;
       for (i = d ; i < arr.length; i++) {
         if (arr[i] < arr[i - d]) {
           temp = arr[i];
           for (var j = i - d; j >= 0 && temp < arr[j]; j -=d) {
               arr[j + d] = arr[j];
               arr[j] = temp;
           }
         }
       }
     }
     while (d > 1)
     return arr;
    }

5.去重算法

function unique(arr) {
            let brr=[];
            for (let i=0; i<arr.length; i++) {
                if (brr.indexOf(arr[i]) < 0) {
                    brr.push(arr[i]);
                }
            }
            return brr;
        }

6.快速排序

function partition(arr,low,high) {
        let    temp=arr[low],   //基准值
            changetemp;         //用于交换的临时变量
        while (low<high) {   
            while (low<high && arr[high]>=temp) {  
                high--;
            }               //当从high往前扫时,大于基准值时,high--
            //swap(arr, low, high);   //当从high往前扫时,小于基准值时,交换基准值和arr[high]位置
            changetemp=arr[low];
            arr[low]=arr[high];
            arr[high]=changetemp;
            while(low<high && arr[low]<=temp) {
                low++;
            }               //当从low往后扫时,小于基准值时,low++
            //swap(arr, low, high);  //当从low往后扫时,大于基准值时,交换基准值和arr[low]的位置
            changetemp=arr[low];
            arr[low]=arr[high];
            arr[high]=changetemp;

        }
        return low;
    }
    //快速排序
    function quick(arr,low,high) {
        let pivot;                 //定义枢轴值
        if (low < high) {
            pivot = partition(arr,low,high);    //求得第一个基准值第一次排序完的位置作为枢轴值
            quick(arr,low,pivot-1);             //对枢轴值前面的序列排序
            document.write(pivot+'<br />');
            quick(arr, pivot+1, high);          //对枢轴值后面的序列排序   
        }
        //return pivot;                        //返回枢轴值
        return arr;                            //返回排序后的数组
    }

7.使用JS方法并将形参减少为仅输入一个数组的快排

function quickSort (arr) {
        if (arr.length<=1) {
            return arr;
        }
        let left = [],
            right = [],
            pivotIndex = Math.floor(arr.length/2);
        let pivot = arr.splice(pivotIndex,1)[0];
        for (let i=0; i<arr.length; i++) {
            if (arr[i] <= pivot) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }

        return quickSort(left).concat(pivot,quickSort(right));
    }

8.JS实现归并排序

function mergeSort (arr) {
    //合并两个有序数组为一个数组
    function merge(left,right) {
        let arr=[];
        while (left.length && right.length) {
            if (left[0] < right[0]) {
                arr.push(left.shift());
            } else {
                arr.push(right.shift());
            }
        }
        return arr.concat(left,right);
    }

    let len=arr.length;
    if (len <= 1) {
        return arr;
    } else {
        let index = Math.floor(len/2),
            left = arr.slice(0,index),
            right = arr.slice(index);
        return merge(mergeSort(left),mergeSort(right));//用递归对数组进行拆分,再返回合并后的数组
    }
}

9.堆排序

function heapSort(array) {
    var result = array.slice(0);
    function swap(array, i, j) {
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    function maxHeapify(array, index, heapSize) {
        var iMax, iLeft, iRight;
        while (true) {
          iMax = index;
          iLeft = 2 * index + 1;
          iRight = 2 * (index + 1);
          
          if (iLeft < heapSize && array[index] < array[iLeft]) {
              iMax = iLeft;
          }

          if (iRight < heapSize && array[iMax] < array[iRight]) {
              iMax = iRight;
          }

          if (iMax != index) {
              swap(array, iMax, index);
              index = iMax;
          } else {
              break;
          }
        }
    }

    function buildMaxHeap(array) {
        var i, iParent = Math.floor(array.length / 2) - 1;

        for (i = iParent; i >= 0; i--) {
            maxHeapify(array, i, array.length);
        }
    }

    function sort(array) {
        buildMaxHeap(array);

        for (var i = array.length - 1; i > 0; i--) {
            swap(array, 0, i);
            maxHeapify(array, 0, i);
        }
        return array;
    }

        return sort(result);
}

10.JS实现顺序查找

function listSearch(arr,data) {
    var result;
    for (var i = 0;i<arr.length; i++) {
        if (arr[i] === data) {
            result = i;
            break;
        }
    }
    if (result === undefined) {
        result = -1;
    }
    return result
}

11.JS实现二分查找

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

12.统计字符串中出现次数最多的字符

function count(str) {
    var obj = {},
        mostStr = "",
        key;
    for(var i = 0; i<str.length; i++) {
        if (!obj[str[i]]) {
            obj[str[i]] = 1;
        } else {
            obj[str[i]]++;
        }
    }
    for(key in obj) {
        if (mostStr === "" || obj[key] > obj[mostStr]) {
            mostStr = key
        }
    }
    return [mostStr,obj[mostStr]]
}

13.斐波拉契数列递归写法

function fibonicco(n) {
    if (n ===1 || n === 2) {
        return 1;
    } else {
        return fibonicco(n-1)+fibonicco(n-2);
    }
}

14.斐波拉契数列迭代写法

function fibonicco(n) {
    var a,b,res;
    a = b = res =1;
    for (var i =3; i<=n; i++) {
        res = a+b;
        a = b;
        b = res;
    }
    return res;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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有许多其他的实现方式和算法,根据具体的需求和使用场景选择适合的算法能够提高代码的性能和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值