前端必知的算法三剑客

49 阅读2分钟

开门见山,算法三剑客即选择排序,冒泡排序和快速排序

一、选择排序

实现思路

  1. 数组的第一项和后边的所有项进行比较,比后一项大,交换位置
  2. 数组的第二项和后边的所有项进行比较,比后一项大,交换位置
  3. 数组中的每一项和后边的所有项进行比较,比后一项大,交换位置
    var arr = [2,5,1,8,6,4,3,9,7];
        // 遍历数组
        // 外循环控制比较项
        for(var i = 0; i<arr.length; i++){
            // arr[i]-比较项
            // 内循环控制后边的所有项
            for(var j = i+1; j<arr.length; j++){
                if( arr[i] > arr[j] ){
                    // 交换位置
                    var temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        console.log(arr);//[1, 2, 3, 4, 5, 6, 7, 8, 9]  
    

二、冒泡排序

   实现思路

  1. 从第一项开始,比较相邻位置的两项,前边比后一项大,交换位置
  2. 有多少个元素,执行多少轮比较
    var arr = [2,5,1,8,6,4,3,9,7];
        // 外循环只是控制比较次数
        for(var i = 0; i<arr.length; i++){
            // 内循环控制相邻元素比较
            // 优化:每轮比较时,最大值都放在最后,下一轮比较时,没有必要和最后的元素作比较
            for(var j = 0; j<arr.length-i; j++){
                // 比较相邻位置的
                if( arr[j] > arr[j+1] ){
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            // 一轮比较结束后,获得本轮循环的最大值
        }
console.log(arr);//[1, 2, 3, 4, 5, 6, 7, 8, 9]  

三、快速排序(用递归实现)

实现思路

  1. 数组中间位置的元素提取出来(丛数组里删掉 splice)
  2. 声明两个空数组 left right
  3. 所有元素和中间值比较,比中间值小的放left中,比中间值大放right中
  4. 把left 中间值 right组成一个数组,完成了一次排序(concat)
  5. left和right 重复上述操作(递归-函数内部调用自己这个函数),直到数组中有一个或没有元素停止(递归一定要跳出循环,否则会死循环)
    var arr = [2,5,1,8,6,4,3,9,7];
        function quickSort(arr){
            // 结束条件
            if(arr.length <= 1){
                return arr;
            }
            // 提取中间元素 splice
            var middle = arr.splice(parseInt(arr.length/2), 1)[0];         
            // 声明两个空数组
            var left = [], right = [];
            // 所有元素和中间值比较
            for(var i = 0; i<arr.length; i++){
                if( arr[i] > middle ){
                    // 比中间位置大,放在right数组
                    right.push( arr[i] );
                }else{
                    // 比中间值小的放left中
                    left.push( arr[i] );
                }
            }
            // 左右数组重复上述操作
            // 组合成为一个新数组
            return quickSort(left).concat(middle, quickSort(right));
        }
console.log(quickSort(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9]  

目前只会这三,一起学习吧~