JavaScript 基础(006_排序算法)

排序算法:最近在浏览技术博客的时候无意中发现了一篇关于排序算法的文章,个人觉得总结的非常好,本人是计算机专业的人,看完之后,在觉得汗颜的同时也是受益良多,作为程序员,多积累是个好习惯。自己动手写一写,加深理解,顺便把好文章分享一下。(本文只是用 js 写了各种排序算法的实现,至于各种排序算法的优劣、怎样在不同场合选择最佳的排序算法,这里就不班门弄斧,网上有很多资料,或者查百度百科。)

JS家的排序算法郑重声明转载):http://www.jianshu.com/p/1b4068ccd505

冒泡排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Bubble Sort</title>
        <script type="text/javascript">
            var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
            console.log(bubbleSort(arr));
            function bubbleSort(arr) {
                var i = arr.length;
                while (i > 0) {
                    for (let j = 0; j < i - 1; j++) {
                        if (arr[j] > arr[j + 1]) {
                            arr[j] = arr[j] + arr[j + 1];
                            arr[j + 1] = arr[j] - arr[j + 1];
                            arr[j] = arr[j] - arr[j + 1];
                        }
                    }
                    i--;
                }
                return arr;
            }
        </script>
    </head>
    <body>
    </body>
</html>

选择排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Select Sort</title>
        <script type="text/javascript">
            var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
            console.log(selectSort(arr));
            function selectSort(arr) {
                var index = 0; // 记录最小数据的数组下标
                if((arr == undefined) || (arr.length == 0)) {
                    return arr;         
                }
                for(let i=0; i<arr.length; i++) {
                    index = i;
                    for(let j=i+1; j<arr.length; j++) {
                        if(arr[j] < arr[index]) {
                            index = j;
                        }
                    }
                    if(index == i) continue;
                    arr[i] = arr[i] + arr[index];
                    arr[index] = arr[i] - arr[index];
                    arr[i] = arr[i] - arr[index];
                }
                return arr;
            }
        </script>
    </head>
    <body>
    </body>
</html>

插入排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Insert Sort</title>
        <script type="text/javascript">
            var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
            console.log(insertSort(arr));
            function insertSort(arr) {
                if((arr == undefined) || (arr.length < 2)) {
                    return arr;         
                }
                for(let i=1; i<arr.length; i++) {
                    for(let j=i; j>0; j--) {
                        if(arr[j] < arr[j-1]) {
                            arr[j] = arr[j] + arr[j-1];
                            arr[j-1] = arr[j] - arr[j-1];
                            arr[j] = arr[j] - arr[j-1];
                        } else {
                            break;
                        }
                    }
                }
                return arr;
            }
        </script>
    </head>
    <body>
    </body>
</html>

希尔排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Shell Sort</title>
<script type="text/javascript">
    var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
    console.log(shellSort(arr));
    function shellSort(arr) {
        if((arr == undefined) || (arr.length < 2)) {
            return arr;
        }
        var len = arr.length;
        for(var fraction=Math.floor(len/2); fraction>0; fraction=Math.floor(fraction/2)) {
            for(var i=fraction; i<len; i++) {
                for(var j=i-fraction; j>=0 && arr[j]>arr[fraction+j]; j=j-fraction) {
                    arr[j] = arr[j] + arr[fraction+j];
                    arr[fraction+j] = arr[j] - arr[fraction+j];
                    arr[j] = arr[j] - arr[fraction+j];
                }
            }
        }
        return arr;
    }
</script>
</head>
<body>
</body>
</html>

归并排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Merge Sort</title>
        <script type="text/javascript">
            function merge(arr, low, mid, high) {
                var i = low;
                var j = mid + 1;
                var k = 0;
                var tmp = [high - low + 1];
                while(i <= mid && j <= high) {
                    if(arr[i] <= arr[j]) {
                        tmp[k] = arr[i];
                        i++;
                        k++;
                    } else {
                        tmp[k] = arr[j];
                        j++;
                        k++;
                    }
                }
                while(i <= mid) {
                    tmp[k] = arr[i];
                    i++;
                    k++;
                }
                while(j <= high) {
                    tmp[k] = arr[j];
                    j++;
                    k++;
                }
                for (k = 0, i = low; i <= high; i++, k++) {
                    arr[i] = tmp[k];
                }
            }

            function sort(arr) {
                var len = arr.length;
                for (let gap = 1; gap < len; gap = 2 * gap) {
                    var i = 0;
                    for (i = 0; i + 2 * gap - 1 < len; i = i + 2 * gap) {
                        merge(arr, i, i + gap - 1, i + 2 * gap - 1);
                    }
                    if (i + gap - 1 < len) {
                        merge(arr, i, i + gap - 1, len - 1);
                    }
                }
                return arr;
            }

            var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
            console.log(sort(arr));
        </script>
    </head>
    <body>
    </body>
</html>

快速排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Quick Sort</title>
        <script type="text/javascript">
            function quickSort(arr) {
                function sort(prev, numsize) {
                    var nonius = prev;
                    var j = numsize - 1;
                    var flag = arr[prev];
                    if((numsize-prev) > 1) {
                        while(nonius < j) {
                            for(; nonius < j; j--) {
                                if(arr[j] < flag) {
                                    arr[nonius] = arr[j];
                                    nonius++;
                                    break;
                                }
                            }
                            for(; nonius < j; nonius++) {
                                if(arr[nonius] > flag) {
                                    arr[j] = arr[nonius];
                                    j--;
                                    break;
                                }
                            }
                        }
                        arr[nonius] = flag;
                        sort(0, nonius);
                        sort(nonius+1, numsize);
                    }
                }
                sort(0, arr.length);
                return arr;
            }
            var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
            console.log(quickSort(arr));
        </script>
    </head>
    <body>
    </body>
</html>

堆排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Heap Sort</title>
        <script type="text/javascript">
            Array.prototype.buildMaxHeap = function() {
                for(let i=Math.floor(this.length/2)-1; i>=0; i--) {
                    this.heapAdjust(i, this.length);
                }
            };

            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);
                }
            };

            Array.prototype.swap = function(i, j) {
                this[i] = this[i] + this[j];
                this[j] = this[i] - this[j];
                this[i] = this[i] - this[j];
            };

            Array.prototype.headSort = function() {
                this.buildMaxHeap();
                for(let i=this.length-1; i>0; i--) {
                    this.swap(0, i);
                    this.heapAdjust(0, i);
                }
                return this;
            };

            var arr = new Array();
            [].push.apply(arr, [3, 2, 4, 9, 1, 5, 7, 6, 8]);
            console.log(arr.headSort());
        </script>
    </head>
    <body>
    </body>
</html>

计数排序:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Count Sort</title>
        <script type="text/javascript">
            Array.prototype.init = function() {
                for(let i=0; i<this.length; i++) {
                    this[i] = 0;
                }
            }
            function countSort(a) {
                var b = new Array(a.length);
                b.init();
                var max = a[0];
                var min = a[0];
                for(let i in a) {
                    if(a[i] > max) {
                        max = a[i];
                    }
                    if(a[i] < min) {
                        min = a[i];
                    }
                }
                var k = max - min + 1;
                var c = new Array(k);
                c.init();
                for(let i=0; i<a.length; ++i) {
                    c[a[i]-min] += 1;
                }
                for(let i=1; i<c.length; ++i) {
                    c[i] = c[i] + c[i-1];
                }
                for(let i=a.length-1; i>=0; --i) {
                    b[--c[a[i]-min]] = a[i];
                }
                return b;
            }   

            var a = [3, 2, 4, 9, 1, 5, 7, 6, 8];
            console.log(countSort(a));
        </script>
    </head>
    <body>
    </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值