js 动画排序算法(选择排序,冒泡排序,归并排序)

         日常开发过程中,我们最常使用到的算法就是排序算法,最常用的排序算法例如选择排序,冒泡排序,归并排序,快速排序,二叉排序,堆排序等,周末闲来无事,刚好回顾下这些算法,并将其中的选择排序,冒泡排序和归并排序,以动画的方式展示,话不多说,先上动画截图,在上代码

1.截图部分
js 动画排序算法(选择排序,冒泡排序,归并排序)

 2.代码

 实现思路:

 即在每进行一轮排序之后做页面渲染(每个数据对应一个颜色块)

/**.

 * User: lsj

 * Date: 14-4-2

 * Time: 下午3:13

 */

var sortManager=(function (){

    //柱状总高度

    var HEIGHT_TOTAL=2000;

   //显示宽度

    var WIDTH_TOTAL=$(window).width(); 

   //颜色数组

    var colorArray=['red','blue','grey','yellow','pink'];

    //生成bar

    function  generateBar(data,index,sumtotal,lengthtotal,container)

    {

        var heightPercentage=data/sumtotal;

        var widthPer=(WIDTH_TOTAL-2*lengthtotal-20)/lengthtotal;

        //柱状高度

        var barHeight=HEIGHT_TOTAL* heightPercentage+"px";

        var barWidth= widthPer+"px";

        var color=colorArray[index%5];

        var bar=$("<div style='margin-bottom: 0;background:"+color+";float: left;margin-right:2px;width:"+barWidth+" ;height:"+barHeight+"'><input type='hidden' value='"+data+"'></div>")

        bar.mouseover(function(e){

           var data=$(this).find("input").val();

           var remind=$("<div class='remind'  style='position: absolute;padding: 10px 15px;border-bottom: 1px solid #cccccc'>"+data+"</div>");

           var x=e.pageX;

           remind.css("left",x);

           var y= e.pageY;

           remind.css("top",y);

           $(document.body).append(remind);

        });

        bar.mouseleave(function(){

               $(document.body).find(".remind").remove();

        });

        //附加bar

        container.append(bar);

    }

    //动画排序结果

    function  animationSort(sortArray,total,container)

    {

       //清空容器

        container.html("");

       var length= sortArray.length;

       for(var i=0;i<length;i++)

       {

           generateBar(sortArray[i],i,total,length,container);

       }

    }

    return{

        /**

         * 冒泡排序

         * @param sortArray

         */

        bubleSort:function(sortArray,sumtotal,container)

        {

            var length=sortArray.length;

            var temp;

            var index=0;

            //一次冒泡

            function bubble()

            {

                for(var j=0;j<length-index-1;j++)

                {

                    if(sortArray[j]>sortArray[j+1])

                    {

                        temp= sortArray[j];

                        sortArray[j]=sortArray[j+1];

                        sortArray[j+1]=temp;

                    }

                }

                //动画排序过程

               animationSort(sortArray,sumtotal,container);

               index++;

               if(index<length)

                   setTimeout(bubble,200);

            }

            setTimeout(bubble,200);

        },

        //选择排序(外加动画效果)

        /**

         *

         * @param sortArray 数组

         * @param sumtotal 数组总和

         * @param container 动画容器(jQuery对象)

         */

        chooseSort:function(sortArray,sumtotal,container)

        {

            var length=sortArray.length;

            //记录最小值下标

            var min;

            //记录临时交换值

            var swap;

            var index=0;

            function switchData()

            {

               min=index;

                //选出最小值

                for(var j=index+1;j<length;j++)

                {

                    if(sortArray[min]>sortArray[j])

                        min = j;

                }

                //一次交换

                swap=sortArray[index];

                sortArray[index]=sortArray[min];

                sortArray[min]=swap;

                //动画排序过程

                animationSort(sortArray,sumtotal,container);

                index++;

                if(index<=length)

                    setTimeout(switchData,200);

            }

            setTimeout(switchData,200);

        },

        /**

         * 归并排序

         * @param sortArray  排序数组

         * @param sumtotal  数组总和

         * @param container 容器

         */

        mergeSort:function(sortArray,sumtotal,container)

        {

            function  merge(begin,mid,end)

            {

                var newarray=[];

                var cursor1=begin,cursor2=mid+1;

                var end1=mid,end2=end;

                var temp=0;

                while((cursor1<=mid)  && (cursor2<=end))

                {

                    if(sortArray[cursor1]<sortArray[cursor2])

                    {

                        newarray[temp]=sortArray[cursor1];

                        cursor1++;

                        temp++;

                    }else if(sortArray[cursor1]>sortArray[cursor2])

                    {

                        newarray[temp]=sortArray[cursor2];

                        cursor2++;

                        temp++;

                    }

                }

                while(cursor1<=mid)

                {

                    newarray[temp]=sortArray[cursor1];

                    cursor1++;

                    temp++;

                }

                while(cursor2<=end)

                {

                    newarray[temp]=sortArray[cursor2];

                    cursor2++;

                    temp++;

                }

                var incre=0;

                for(var i=begin;i<=end;i++)

                {

                    sortArray[i]=newarray[incre];

                    incre++;

                }

            }

            function  mSort(begin,end)

            {

                var mid= ~~((begin+end)/2);

                if(begin<end)

                {

                    mSort(begin,mid);

                    mSort(mid+1,end);

                    merge(begin,mid,end);

                    //动画排序过程

                    animationSort(sortArray,sumtotal,container);

               }

            }

            var begin=0;

            var length=sortArray.length;

            mSort(begin,length-1);

        }

    }

})();

相关推荐