直接插入排序(Straight Insertion Sort)

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>直接插入排序(Straight Insertion Sort)</title>
    <link href="bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <link type="text/css" rel="stylesheet" href="css/common.css">
    <script type="text/javascript" src="js/jQuery-2.1.4.min.js"></script>
    <script src="bootstrap-3.3.5/js/bootstrap.min.js"></script>
    <script>
        var left = 200;
        var eleWidth = 60;
        var marginWidth = 20;
        var size = 10;
        var eleTop = 300;
        var pop = 400;
        var middle = 150;
        function genNumArray() {
            var numArray = new Array(size);
            for (var i = 0; i < size; i++) {
                var num = Math.floor((Math.random() * 100));
                if (num == 0) {
                    num += 1;
                } else if (num == 100) {
                    num -= 1;
                }
                numArray[i] = num;
            }
            return numArray;
        }

        function insertSort(numArray) {
            for (var i = 1; i < numArray.length; i++) {
                var value1 = numArray[i];
                for (var j = i - 1; j > -1; j--) {
                    var value2 = numArray[j];
                    if (value2 > value1) {
                        numArray[j + 1] = value2;
                        numArray[j] = value1;
                    }
                }
            }
            console.log(numArray)
        }

        function oneLoop(start, end, numArray) {
            if (start < end) {
                var value = numArray[start];
                selectElement(start);
                moveElement(start, middle+"px", function () {
                    var secondIndex = start - 1;
                    secondLoop(value, start, secondIndex, end, null, numArray);
                });
            } else {
                console.log(numArray);
            }
        }

        function secondLoop(value1, i, j, end, id, numArray) {
            var value2 = numArray[j];
            selectElement(j);
            moveElement(j, middle+"px", function () {
                if (value2 > value1) {
                    numArray[j + 1] = value2;
                    numArray[j] = value1;
                    var e1 = $("#" + (j + 1));
                    var e2 = $("#" + j);
                    e1.attr("id", j);
                    e2.attr("id", (j + 1));
                    var e1Left = e2.offset().left + "px";
                    var e2Left = e1.offset().left + "px";
                    e1.animate({left: e1Left});
                    e2.animate({left: e2Left}, function () {
                        moveElement((j + 1), 400+"px", function () {
                            unSelectElement((j + 1));
                            if (j != 0) {
                                secondLoop(value1, i, (j - 1), end, j, numArray);
                            } else {
                                moveElement(j, 400+"px", function () {
                                    unSelectElement(j);
                                    oneLoop(i + 1, end, numArray);
                                });
                            }
                        });
                    });
                } else {
                    if (j != 0) {
                        moveElement(j, pop+"px", function () {
                            unSelectElement(j);
                            secondLoop(value1, i, (j - 1), end, id, numArray);
                        });
                    } else {
                        moveElement(j, pop+"px", function () {
                            unSelectElement(j);
                            if (id) {
                                moveElement(id, pop+"px", function () {
                                    unSelectElement(id);
                                    oneLoop(i + 1, end, numArray);
                                });
                            } else {
                                moveElement(i, pop+"px", function () {
                                    unSelectElement(i);
                                    oneLoop(i + 1, end, numArray);
                                });
                            }
                        });
                    }
                }
            })
        }

        function selectElement(id) {
            var e = $('#' + id);
            $(e).attr("class", "number-select");
        }

        function unSelectElement(id) {
            var e = $("#" + id);
            $(e).attr("class", "number");
        }


        function moveElement(id, top, callback) {
            var e = $("#" + id);
            if (!top) {
                top = e.offset().top + "px";
            }
            $(e).animate({top: top}, callback);
        }

        $(document).ready(function () {
            var numArray = genNumArray();
            var content = "";
            $(numArray).each(function (i) {
                content += '<div id="rectangle' + i + '"class="rectangle" style="left:' + (left + i * eleWidth) + 'px;top:'+eleTop+'px;"></div>';
            });
            $("body").html($("body").html() + content);

            $(numArray).each(function (i, item) {
                $("body").html($("body").html() + '<div id="' + i + '" class="number" style="z-index:9999;left:' + (left + i * eleWidth + marginWidth) + 'px;top:'+(eleTop+100)+'px;">' + item + '</div>')
            });

            $('#startBtn').click(function () {
                oneLoop(1, size, numArray);
            });
        });
    </script>
</head>
<body>
<h4 class="page-header">插入排序—直接插入排序(Straight Insertion Sort)</h4>
<dl>
    <dt>基本思想</dt>
    <dd>将一个记录插入到已排序好的有序表中,从而得到一个新记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。</dd>
    <dd>如果一个已有元素和插入元素是相等的,那么将把插入元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,所以插入排序是<span style="font-weight:bold;color: red">稳定</span>的。</dd>
</dl>
<button id="startBtn">开始排序</button>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值