排序

插入排序 [希尔排序,插入排序]

选择排序 [堆排序]

归并排序

交换排序 [冒泡排序,快速排序]

基数排序

特点:

  所需空间最多:归并排序

  所需空间最少:堆排序

  平均最快:快速排序

  不稳定:快速,希尔、堆排

这么多算法我们的怎么选择应用场景呢?

 

 

我们要参考几个条件

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小的放在第二位 。。。”

function selectSort(array){
  let L = array.length,min,i = 0,j = 0,n=null;
  for(;i<L-1;i++){
    min = i;
    for (j=i;j<L;j++){
      if(array[min]>array[j]){
        min=j
      }
    }
    if(i!==min){
      n=array[i];
      array[i]=array[min];
      array[min]=n;
    }
  }
  console.log(array);
}
selectSort(ns);   //[2, 5, 5, 6, 10, 12, 19, 23, 25, 28, 33, 95, 503, 993]


 插入排序  

“假定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]

 

posted @ 2017-10-11 10:00  慧宁师  阅读(187)  评论(0编辑  收藏  举报