冒泡排序
每次循環,比較當前位置項與下一個位置項的大小,如果當前項 > 后一項,則交換兩者的位置。每次循環比較都能選擇出一個最大值,放在末尾,剩余待篩選的比較項就減少一項。
如果數組存在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]