javascript:ダブルリンク表-挿入ソート

5588 ワード

配列記憶の前提の下で、並べ替えアルゴリズムを挿入します.最悪の場合、前の要素は挿入点に空きスペースを残して、ターゲット要素を挿入します.
チェーンに換える時、このような大量移動をする必要はないことは明らかです.各ノードの前駆ノードの「ポインタ」によって、前に挿入点を見つけたら、直接にターゲット値を元のチェーンから外して、挿入点でチェーンを二つに切って、目標点と再び接続すればいいです. 
<!doctype html>

<html>

<head>

    <title>   -    </title>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

</head>

<script type="text/javascript">

    //   

    var Node = function (pData) {

        this.next = null; //  “  ”

        this.prev = null; //  "  "

        this.data = pData;

    }



    //   (  :       ,    ,           1     )

    var DbLinkList = function () {

        this.head = new Node(null); //         



        //     

        this.insert = function (pNodeValue) {

            var newNode = new Node(pNodeValue);

            //       

            if (this.head.next == null) {

                this.head.next = newNode;

                newNode.prev = this.head;

                return;

            }



            //         

            var p = this.head;

            while (p.next != null) {

                p = p.next;

            }

            p.next = newNode;

            newNode.prev = p;

        }



        //   n       

        this.getData = function (index) {

            if (index < 1 || index > this.size) {

                return null;

            }

            var p = this.head;

            var i = 1;

            while (p.next != null && i <= index) {

                p = p.next;

                i += 1;

            }

            return p.data;

        }



        //    

        this.getTail = function () {

            if (this.head.next == null) {

                return null;

            }

            var p = this.head.next;

            while (p.next != null) {

                p = p.next;

            }

            return p;

        }



        //         

        this.removeAt = function (index) {

            if (index < 1 || index > this.size) {

                return null;

            }



            var p = this.head;

            var i = 1;



            //      ,  index        

            while (p.next != null && i < index) {

                p = p.next;

                i += 1;

            }



            p.next = p.next.next; //  index            

            p.next.prev = p;

            return p.data; //                

        }



        //      

        this.print = function () {

            document.write("<br/>");

            if (this.head.next == null) {

                return;

            }

            var p = this.head.next;

            while (p.next != null) {

                document.write(p.data + " ");

                p = p.next;

            }

            document.write(p.data + " "); //      ,      

            document.write("<br/>");

        }



        //        

        this.printFromBack = function () {

            document.write("     " + this.size + "   ,       :<br/>");

            var tail = this.getTail();

            var p = tail;

            if (p == null) {

                return;

            }

            while (p.prev != null) {

                document.write(p.data + " ");

                p = p.prev;

            }

            document.write("<br/>");

        }



        //    

        this.insertSort = function () {

            if (this.head.next == null || this.head.next.next == null) {

                return;

            }

            var p = this.head.next;

            while (true) {

                if (p == null) {

                    return;

                }

                var t = p.prev;

                //    p      

                while (t.prev != null && t.data > p.data) {

                    t = t.prev;

                }

                //       p     ,    ,

                //  ,       

                if (t.next == p) {

                    p = p.next;

                    continue;

                }

                // p          ,              

                var x = p.next;

                // p      

                if (p.next != null) {

                    p.next.prev = p.prev;

                }

                p.prev.next = p.next;

                //p   t  

                t.next.prev = p;

                p.next = t.next;

                t.next = p;

                p.prev = t;

                this.print(); //    ,   	

                //   p         "  "    

                p = x;

            }

        }



    }



    var linkTest = new DbLinkList();

    linkTest.insert(10);

    linkTest.insert(9);

    linkTest.insert(8);

    linkTest.insert(7);

    linkTest.insert(6);

    linkTest.insert(5);

    linkTest.insert(4);

    linkTest.insert(3);

    linkTest.insert(2);

    linkTest.insert(1);





    document.write("--   ---<br/>")

    linkTest.print();

    linkTest.insertSort();

    document.write("<br/>--   ---<br/>")

    linkTest.print();

 

</script>

</html>

 --ソート前---10 9 8 7-6 5 4 2 1 9 9 7 7 7 7 5 2 1 8 10 7 5 3 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2 7 7 7 7 7 5 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4を並べ替えた後、7 7 7 7 7 7 7-8