js 学习总结:冒泡排序的实现以及Array.prototype

2020-05-09  本文已影响0人  泰然自若_750f

冒泡排序

每次循环,比较当前位置项与下一个位置项的大小,如果当前项 > 后一项,则交换两者的位置。每次循环比较都能选择出一个最大值,放在末尾,剩余待筛选的比较项就减少一项。
如果数组存在n项,那么需要循环执行筛选的次数为n次

/**
 * 优化冒泡排序 
 * flag 做标记
  
 * @param {*} arr 
 */

function bubbleSort(arr){

    for(let i=0;i<arr.length;i++)
    {
        //标记
        let flag=true;
        for(let j=0;j<arr.length-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                flag=false;
                //前一项大于后一项,交换位置
                //采用es6 解构
                [arr[j],arr[j+1]]=[arr[j+1],arr[j]];
                
            }
        }
        //本轮循环没有交换位置,说明已经是一个有序数组
        if(flag) break;
    }
    return arr;

}

Array.prototype.sort 的简易实现

**sort()** 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort(); 
const array1 = [1, 30, 4, 21, 100000];
array1.sort(); // [1, 100000, 21, 30, 4]

详细用法可点击链接
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

下面依赖冒泡排序实现简易版的Array.prototype.sort()


/**
 * 冒泡排序 
 * flag 做标记
 * @param {*} arr 
 * @param {*} func 
 */

function bubbleSort(arr,func){

    for(let i=0;i<arr.length;i++)
    {
        //标记
        let flag=true;
        for(let j=0;j<arr.length-i-1;j++)
        {
            if(func(arr[j],arr[j+1]))
            {
                flag=false;
                //前一项大于后一项,交换位置
                //采用es6 解构
                [arr[j],arr[j+1]]=[arr[j+1],arr[j]];
            }
        }
        //本轮循环没有交换位置,说明已经是一个有序数组
        if(flag) break;
    }
    return arr;

}
/**
 * 在数组原型上自定义实现数组排序
 * 
 */
Array.prototype._sort=function (func) {
        
         if(typeof func!=='function')
         {
             func=(a,b)=>a-b
         }

       return  bubbleSort(this,func);
    
}
//使用
[3,0,3,2,5,90.89,64,98]._sort((a,b)=>a-b>0) //[0, 2, 3, 3, 5, 64, 90.89, 98]
[3,0,3,2,5,90.89,64,98]._sort((a,b)=>a-b<0) //[98, 90.89, 64, 5, 3, 3, 2, 0]
上一篇 下一篇

猜你喜欢

热点阅读