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
posted @ 2017-09-19 13:43  徐同保  阅读(167)  评论(0编辑  收藏  举报