冒泡排序
每次循环,比较当前位置项与下一个位置项的大小,如果当前项 > 后一项,则交换两者的位置。每次循环比较都能选择出一个最大值,放在末尾,剩余待筛选的比较项就减少一项。
如果数组存在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]