zoukankan      html  css  js  c++  java
  • 【js基础】js排序方法——快排+堆排+插排+选择排

    快排

            Array.prototype.fastSort = function(){
                     var arr = this;
    
                     function sort(left, right, arr){
                         if( left >= right){
                             return;
                         }
                         var key = arr[left];
                         var i = left;
                         var j = right;
                         
                         while(i < j){
                             while(i < j && arr[j] >= key){
                                 j--;
                             }
                             arr[i] = arr[j];
                             while(i < j && arr[i] <= key){
                                 i++;
                             }
                             arr[j] = arr[i];
                         }
                         arr[i] = key;
                         sort(left, i - 1, arr);
                         sort(i + 1, right, arr);
                     }
    
                     sort(0, arr.length - 1, arr);
    
                     return arr;
                 }

    插排

            Array.prototype.insertSort = function(){
                     var arr = this;
                     var len = arr.length;
                     for(var i = 1; i < len; i ++ ){
                         var j = i - 1;
                         var tmp = arr[i];
                         while(j >= 0 && tmp < arr[j]){
                             arr[j + 1] = arr[j];
                             j--;
                         }
                         if(j != i - 1){
                             arr[j + 1] = tmp;
                         }
                     }
                     return arr;
                 }

    选择排序

            Array.prototype.selectSort = function(){
                     var arr = this;
                     var len = arr.length;
                     var min;
                     var tmp;
                     for(var i = 0; i < len - 1; i ++ ){
                         min = i;
                         for(var j = i + 1; j < len; j++){
                             if(arr[min] > arr[j]){
                                 min = j;
                             }
                         }
                         if(min != i){
                             tmp = arr[min];
                             arr[min] = arr[i];
                             arr[i] = tmp;
                         }
                     }
                     return arr;
                 }

    堆排序

           Array.prototype.swap = function(i, j){
                    var tmp = this[i];
                    this[i] = this[j];
                    this[j] = tmp;
                }
    
                //大顶堆
                Array.prototype.buildMaxHeap = function(){
                    for(var i = Math.floor(this.length/2) - 1; i >= 0; i--){
                        this.heapAdjust(i, this.length);
                    }
                };
    
                //调整堆
                Array.prototype.heapAdjust = function(i, j){
                    var max = i;
                    var left = 2 * i + 1;
                    var right = 2 * i + 2;
                    if(left < j && this[max] < this[left]){
                        max = left;
                    }                 
                    if(right < j && this[max] < this[right]){
                        max = right;
                    }                 
                    if(max != i){
                        this.swap(i,max);
                        this.heapAdjust(max,j);
                    };
                }
                
                //堆排序
                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;
                };
    只有足够努力,才能看起来毫不费力
  • 相关阅读:
    ACCESS中不支持FULL JOIN的解决方案
    C#語法學習異常處理(Exception)
    C#語法學習(索引器[indexer])
    C#語法學習四(Char)
    人生的35个经典好习惯
    自学.NET之路属性,索引器
    Lucene.Net介紹
    Sql Server 日期格式转换
    MS SQL中的交叉数据报表
    C#語法學習一(Array,ArrayList)
  • 原文地址:https://www.cnblogs.com/codelovers/p/4799095.html
Copyright © 2011-2022 走看看