• javascript冒泡排序,快速排序和堆排序


    冒泡排序:

    比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对

    到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。

    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。


    <!DOCTYPE html>
    <html lang="en">
    <head>
    </head>
    <body>
    <script>
        function bubbleSort(arr) {
            var len = arr.length;
            for (var i = 0; i < len; i++) {
                for (var j = 0; j < len - 1 - i; j++) {
                    if (arr[j] > arr[j+1]) {
                        var temp = arr[j+1];
                        arr[j+1] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            return arr;
        }
        var arr = [6, 5, 3, 1, 8, 7, 2, 4];
        console.log(bubbleSort(arr));
    </script>
    </body>
    </html>




    下面的动画也挺有意思的吐舌头


    快速排序和堆排序:

    <!DOCTYPE html>  
    <html lang="en">  
    <head>  
    </head>  
    <body>  
    <script>  
        //快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的
        //所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归
        //进行,以此达到整个数据变成有序序列。
        function quickSort(array) {
            function sort(prev, numsize) {
                var nonius = prev;
                var j = numsize - 1;
                var flag = array[prev];
                if ((numsize - prev) > 1) {
                    while (nonius < j) {
                        for (; nonius < j; j--) {
                            if (array[j] < flag) {
                                array[nonius++] = array[j]; //a[i] = a[j]; i += 1;
                                break;
                            };
                        }
                        for ( ; nonius < j; nonius++) {
                            if (array[nonius] > flag) {
                                array[j--] = array[nonius];
                                break;
                            }
                        }
                    }
                    array[nonius] = flag;
                    sort(0, nonius);
                    sort(nonius + 1, numsize);
                }
            }
            sort(0, array.length);
            return array;
        }  
    
        //堆排序:堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要不小于其孩子,最小堆要求节点元素
        //都不大于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得
        //知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每
        //次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列。
    
        Array.prototype.buildMaxHeap = function() {
            for(var i = Math.floor(this.length / 2) - 1; i >= 0; i--) {
                this.heapAdjust(i, this.length);
            }
        };
             
        Array.prototype.swap = function(i, j){
            var tmp = this[i];
            this[i] = this[j];
            this[j] = tmp;
        };
             
        Array.prototype.heapSort = function() {
            this.buildMaxHeap();
            for(var i = this.length - 1; i > 0; i--) {
                this.swap(0,i);
                this.heapAdjust(0,i);
            }
            return this;
        };
             
        Array.prototype.heapAdjust = function(i, j) {
            var largest = i;
            var left = 2 * i + 1;
            var right = 2 * i + 2;
             
            if (left < j && this[largest] < this[left]) {
                largest = left;
            }
             
            if (right < j && this[largest] < this[right]) {
                largest = right;
            }
             
            if(largest != i) {
                this.swap(i, largest);
                this.heapAdjust(largest, j);
            }
        };
     
        var arr = [6, 5, 3, 1, 8, 7, 2, 4];  
        console.log('排序前:', arr); 
        console.log('快速排序:', quickSort(arr));   
    
        arr = [6, 5, 3, 1, 8, 7, 2, 4];
        console.log('排序前:', arr); 
        console.log('堆排序:', arr.heapSort());
    </script>  
    </body>  
    </html
    堆排序参考链接:https://www.cnblogs.com/0zcl/p/6737944.html
  • 相关阅读:
    datatable一些用法续
    验证视图状态MAC失败
    datatable应用select方法后变成行数组的问题的解决
    [jQuery] html中两个select之间option元素的add与remove,多值上传
    [VBS] 使用vbs文件保证程序运行,并模拟键盘回车键
    [jQuery] 为table各行添加不同颜色的class
    [转]谈谈个人网站建设和经营
    [jQuery] jquery如何reset表单(form)
    兼容Firefox IE Chrome的onkeydown事件处理方法
    [bat] 使用bat文件保证指定程序运行
  • 原文地址:https://www.cnblogs.com/xutongbao/p/9924976.html
Copyright © 2020-2023  润新知