读《啊哈!算法》——桶排序

小案例

一次考试中五个同学分别考了5分、3分、5分、2分、8分(10分满分),请按照从大到小的顺序排序。

提示的思路

1、要排序的5个数是在0-10之间的;
2、把分数从0-10当做数组的索引声明一个数组,初始化值为0;
3、要排序的5个数,依次放到对应的桶里,出现一次,对应的桶的值+1;最终桶值为0的表示没有出现该分数;
4、输出桶值不为0的对应索引,值为几就打印几次;


Paste_Image.png
我的代码
<script>
    window.onload=function(){
        //1、要排序的5个数是在0-10之间的;
        var scoreArray = [5,3,5,2,8];
        //2、把分数从0-10当做数组的索引声明一个数组,初始化值为0;
        var sortArray =[];
        for(var i=0;i<11;i++){
            sortArray[i]=0
        }
        //3、要排序的5个数,依次放到对应的桶里,出现一次,对应的桶的值+1;
        for(var i=0;i<scoreArray.length;i++){
            var index = scoreArray[i];
            sortArray[index] ++;
        }
        //4、输出桶值不为0的对应索引,值为几就打印几次;
        for(var i=sortArray.length-1;i>=0;i--){
            if(sortArray[i]!=0){
                for(var j=0;j<sortArray[i];j++){
                    console.log(i);
                }
            }
        }
    }
</script>

案例升级

输入n个0-1000之间的整数,并把它们从大到小排序。

function BucketSort(n){
    var buketArray =[];
    for(var i=0;i<=1000;i++){
        buketArray[i]=0;
    }
    for(var i=0;i<n;i++){
        var value = prompt('请输入0-1000之间的整数');
        buketArray[value] ++;
    }
    var  sortArray=[];
    for(var i=1000;i>=0;i--){
        if(buketArray[i]!=0){
            for(var j=0;j<buketArray[i];j++){
                sortArray.push(i);
            }
        }
    }
    return sortArray;
}

反思

for循环用的多,注意代码优化。例如在循环输入n个数的同时就可以为对应的桶值+1,不必设两个for循环。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法——计数排序、桶排序、基数排序 计数排序 计数排序有如下四个步骤。 首先会对每个输入进行频率统计,得...
    sunhaiyu阅读 1,186评论 0 11
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,753评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,237评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,289评论 0 2
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,320评论 0 35