21任务十九——可视化数据排序

Posted cjlalala

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21任务十九——可视化数据排序相关的知识,希望对你有一定的参考价值。

0、题目

  • 基于任务18
  • 限制输入的数字在10-100
  • 队列元素数量最多限制为60个,当超过60个时,添加元素时alert出提示
  • 队列展现方式变化如图,直接用高度表示数字大小
  • 实现一个简单的排序功能,如冒泡排序(不限制具体算法),用可视化的方法表达出来

1、解答过程

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>task19</title>
    <style>
    #button{
        display:inline-block;
    }
    ul{
        list-style: none;
        height:550px;
        width:90%;
        display:flex;
        justify-content: center;
        align-content: flex-end;
        align-items: flex-end;
    }
    li{
        background-color: rgba(111, 96, 251, 1);
        color:white;
        width:15px;
        display:inline-block;
        margin-left:3px;
    }
    </style>
</head>
<body>
    <input id="input" type="text">
    <div id="button">
        <button id="leftin">左侧入</button>
        <button id="rightin">右侧入</button>
        <button id="leftout">左侧出</button>
        <button id="rightout">右侧出</button>
        <button id="random">随机生成一组数据</button>
        <button id="sortdata">排序</button>
    </div>
    <ul id="result">
    </ul>
<script>
    var number=[];
    var $=function(id){
      return document.getElementById(id);
    }
    //给按钮的父元素添加事件委托,避免给每个按钮添加点击事件
    $("button").addEventListener("click",function(e){  
        var target=e.target;
        var input=$("input").value;
        switch(target.id){
            case "leftin":{
                if(input>100||input<10||isNaN(input))  alert("请输入10-100之间的数");
                if(number.length<60) {    //控制最多只能输入60个数据
                  number.unshift(input); 
                  show();
                }
                else alert("最多只能输入60个数据!");    
                break;
            }
            case "rightin":{
                if(input>100||input<10||isNaN(input)) alert("请输入10-100之间的数");
                if(number.length<60){
                    number.push(input);
                    show(); 
                }
                else alert("最多只能输入60个数据!");
                break;
            }
            case "leftout":{
                alert(number.shift(number[number.length-1]));
                show();
                break;
            }
            case "rightout":{
                alert(number.pop(number[0]));
                show();
                break;
            }
        }
    })
    //给输出的结果添加事件委托,使点击的元素被删除
    $("result").addEventListener("click",function(e){
        if(e.target.nodeName!="LI") return;        //看点击的是不是li标签
        var tar=parseInt(e.target.getAttribute("id"))  //得到被点击元素的id属性,之前id绑定的是该元素在数组中的序号
        number.splice(tar,1);     //删除数组number中的元素,1代表只删除一个元素
        show();
        return number;
    })
    //生成一组随机数
    $("random").onclick=function(){
        number=[];
           for(var i=0;i<60;i++){
                number[i]=parseInt(Math.random()*90+10);
            }
        show();
        return number;
    }
    //将数据用柱状图的形式呈现在页面上
    function show(){
        var content=" ";
        for(var i=0;i<number.length;i++){
                content+="<li id=‘"+i+"‘style=‘height:"+number[i]*5+"px;‘>"+number[i]+"</li>";
            }
        $("result").innerHTML=content;
    }
    //数据排序的过程
    $("sortdata").onclick=function(){
        var max=0,i=0,j=1;
        time=null;
        time=setInterval(run,5);
        function run(){
            if(i<number.length){
                if(j<number.length){
                    if(number[i]>number[j]){
                        max=number[i];
                        number[i]=number[j];
                        number[j]=max;
                        show();    //绘制这一次数据交换后的柱状图
                    }
                 j++;
                }
                else{
                    i++;
                    j=i+1;
                }
            }
            else{
                clearInterval(time);
                return;
            }
        }    
    }
</script>
</body>
</html>

2、遇到的问题

  这一问相比较17、18问,主要添加的任务就是要把数据的排序过程一步一步的展现出来

  这里采用的排序方法是先将第一个数和第二个数比较,如果第一个数大于第二个数就交换两个数的位置(将小的数排在前面),再依次比较第一个数和第三个数。。。。以此类推,那么这一轮下来就可以将最小的数排在第一位,第二轮就拿第二个数和后面的依次比较,得到第二小的数排在第二位,经过number.length轮就可以把所有的数按从小排好了。

  至于如何用可视化的方式将过程展现出来,这里要用到setInterval()方法,该方法可按照指定的周期(以毫秒计)来调用函数或计算表达式,所以我们只要以一定的周期调用排序的每一步,也就是将每一次数据交换之后得到的柱状图以一定的时间间隔展现出来,那么排序的过程看起来就是一步一步进行的,而不是一瞬间就结束了。

  注意:setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

以上是关于21任务十九——可视化数据排序的主要内容,如果未能解决你的问题,请参考以下文章

Python进阶(三十九)-数据可视化の使用matplotlib进行绘图分析数据

29任务二十九——阻止点击之后的默认事件

数据可视化基础专题(二十九):Pandas基础 合并merge

练习三十九:数组插入排序

Java并发编程(十九):ScheduledThreadPoolExecutor总结与源码分析

Java并发编程(十九):ScheduledThreadPoolExecutor总结与源码分析