基础算法学习之排序篇(js实现)

1,最近在看 啊哈算法,觉得很有趣,特把其中有意思的算法记下来,

简易的桶排序法
var a =  new Array(2,5,3,4,6,8,4,4,2,9);
var b = new Array(10); //标记数组
var d = new Array();  //存放数组
var i,j;
for (i=0;i<=11;i++){
    b[i] =0;
}
for( i=0,j=1;i <=10;i++,j++){
     var c =a[i];
    b[c]++;
}
for (i=0;i<=10;i++){
    for (j =1;j<=b[i];j++) {
        d.push(i);
    }
}
console.log(d);
运行结果:
[ 2, 2, 3, 4, 4, 4, 5, 6, 8, 9 ]
 该算法实际是讲一列数组中的所有数都标记在一个数组里,最后在从小到大打印出现的次数所对应的数此算法优点是时间快,
 缺点是如果数组的范围太过庞大就会出现异常,比如超过4 294 967 295。
 算法时间度为O(M+N)

冒泡排序
var c = new Array(1,8,6,18,16,548,21,5,63);
var i,j;
for(j=0;j<c.length-1;j++){
    for (i = 0;i <=c.length-1;i++){
        if(c[i]>c[i+1]){
            var d = c[i+1];
            c[i+1] = c[i];
            c[i] = d;
        }
    }
}
console.log(c);
运行结果:
[ 1, 5, 6, 8, 16, 18, 21, 63, 548 ]

上面的冒泡算法实现是按照每次比较相邻的两个数,把较大的数放在较小数的后面,依次比较到数组的最后一项
这时会发现最大的一位数已经交换到最后一位,称为归位,说明有一位数已经排好了,这一过程先称为一趟,接下来
接下来从新从数组的第一位开始相邻比较,交换位置,归位第二大的数,这样总共要经历n-1(假设有n个数组)趟。
该算法是双重嵌套循环所以这个算法的时间复杂度O(N^2).
缺点是时间复杂度高,效率低。

快速排序
var e = new Array(13,45,4,45,3,1,53,87,1,5);
function quicksort(left,right) {
    var i,j,t,temp;
    if(left>right)return;
    temp = e[left];
    i=left;
    j=right;
    while (i!=j){
        while(e[j]>=temp && i <j){
            j--;
        }
        while(e[i]<=temp && i <j){
            i++;
        }
        if(i<j){
            t = e[i];
            e[i] = e[j];
            e[j] = t;
        }
    }
    e[left] =e[i];
    e[i] = temp;
    quicksort(left,i-1);
    quicksort(i+1,right);
    return;
}
quicksort(0,e.length-1);
console.log(e);
运行结果:
[ 1, 1, 3, 4, 5, 13, 45, 45, 53, 87 ]

快速排序法是采用“二分法”的思想,先用一个基数去比较,将要排序的数组分成两分,然后通过递归一一将
所有基数归位,具体过程如下
选取数组中最左边的基数是13
1  5  4  1  3  13  53  87  45  45 这是第一趟的结果 可以看到13把数组分为两半,并且自己位置也排好称为归位,接下来进入递归
1                                               选取的基数为1,1归位。接着在右递归
   3  4  1  5                                基数为5,归位,接着在左递归
   1  3  4                                    基数为3,归位,接着在左递归
   1                                            基数为1,归位,接着在右递归
           4                                    基数为4,归位,接着在基数13的右边递归(实质是第一次的所有递归完成,进行下一步右递归)。
      ...(此处省略13以右排序,与左边相同)
1  1  3  4  5  13 ...
快速排序算法优点是算法比较快速高效,由于基数取得是第一位,并不是每次都能将数组很好的“二分”所以它的平均算法的时间复杂度O(NlogN)。


快速排序算法是最常用的算法之一,JavaScript中sort()方法就是快速排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值