排序
插入排序 [希尔排序,插入排序]
选择排序 [堆排序]
归并排序
交换排序 [冒泡排序,快速排序]
基数排序
特点:
所需空间最多:归并排序
所需空间最少:堆排序
平均最快:快速排序
不稳定:快速,希尔、堆排
这么多算法我们的怎么选择应用场景呢?
我们要参考几个条件
1.数据的规模;
2.数据的类型
3.数据已有的顺序
一般来说排序算法在数据量小的时小是体现不出来差距的,
so我们就看看数据的类型,如果是整数类型(桶排序较好),浮点数,都要区别考量
再来我们还要看数据已有的顺序(部分数据排序有规律),如果选择不好的算法会多算很多步,这个时个我们用冒泡算法就好了
var ns = [23,5,33,25,12,19,10,5,2,95,28,6,993,503];
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
sort 排序(推荐)
javascript内置API ,支持1维,多维排序(很好用),还支持Ascll字母表排序
ns.sort(function (a,b) { return a<b; })
多维排序
items.sort(function (a, b) {
return a.value < b.value;
});
冒泡排序
“比较任何相邻的两项,如果A比B大,则交换它们,就这样两两相比,最后就比到最后的数
function bubleSort (array){ let L = array.length,i=0,j=0,swap=null; for (;i<L;i++){ for (j=0;j<L-1-i;j++) { if (array[j]>array[j+1]) { swap = array[j+1]; array[j+1] = array[j]; array[j] = swap; } } } console.log(array) } bubleSort(ns); //[2, 5, 5, 6, 10, 12, 19, 23, 25, 28, 33, 95, 503, 993]
选择排序
“找到数值最小的放在第1位,再找数值第2小的放在第二位 。。。”
插入排序
“假定1是排好的(这个1,最好是最大的,或者最小的-按你的排序来),由老2说我是放在1还是2呢?,再来拿老3比1和2,我是放在1还是2或是不动呢。老4说我是放在1还是2或是3呢或是不动呢?老5。。。依此类推”
function insertSort(array){
let L = array.length,j,i,swap;
for (i=1;i<L;i++){
j=i;
swap = array[i];
while(j>0&&array[j-1]>swap){
array[j] = array[j-1];
j--;
}
array[j] = swap;
}
console.log(array)
}
insertSort(ns) //[2, 5, 5, 6, 10, 12, 19, 23, 25, 28, 33, 95, 503, 993]
归并排序(二叉树的思想分治排序 -分而治之) -快速排序 和 红黑树 都类似这种思路,二叉树搜索,等等。。
"思想就是 随便取其中的一个值 A,逐依进行比较,比A小的放左边数组,比A大的放右边数组,进行递归,最后合并"
function mpx(arr){ if(!Array.isArray(arr)){ return arr; } let L=arr.length; if(L<=1){ return arr; } let key=arr[0]; var left=[], right=[]; for(var i=1;i<L;i++){ arr[i] <= key? left.push(arr[i]): right.push(arr[i]); } left = mpx(left); right = mpx(right); return left.concat(key,right); }; console.log(mpx(ns));//[2, 5, 5, 6, 10, 12, 19, 23, 25, 28, 33, 95, 503, 993]