zoukankan      html  css  js  c++  java
  • js 排序算法实现

    function ArrayList(){
            //属性
           this.array=[]
            //方法
            //将数据可以插入到数组中的方法
            ArrayList.prototype.insert=function(item){
               this.array.push(item)
            }
    
            //toString
            ArrayList.prototype.toString=function(){
                return this.array.join('-')
            }
           
           //交换两个位置的数据
           ArrayList.prototype.swap=function(m,n){
              var temp=this.array[m]
              this.array[m]=this.array[n]
              this.array[n]=temp
           }
    
            //实现排序算法
            //冒泡排序
            ArrayList.prototype.bubbleSort=function(){
                //1.获取数组的长度
                var length=this.array.length
                //第一次比较,i=0 比较0 和 1位置的两个数据,如果0位置大于 1位置的数据
                //最后一次进来 i=length-2,比较 length-2 和 length-1 的两个数据
                for(var j=length-1;j>=0;j--){
                    for(var i=0;i<j;i++){
                        if(this.array[i]>this.array[i+1]){
                            //交换两个数据
                            this.swap(i,i+1)
                        }
                   }
                }
               
            }
    
            //选择排序
             ArrayList.prototype.selectionSort=function(){
                //1.获取数组的长度
                var length=this.array.length
    
                //2.外层循环:从 0 位置开始取数据
                var min=0
                for(var j=0;j<length-1;j++){
                    //内存循环:从 i+1位置开始,和后面的数据进行比较
                    var min=j
                    for(var i=min+1;i<length;i++){
                        if(this.array[min]>this.array[i]){
                            min=i
                        }
                    }
                    this.swap(min,j)
                }
             }
    
             //插入排序
             ArrayList.prototype.insertionSort=function(){
                 //1.获取数组的长度
                 var length=this.array.length
                 //2.外层循环:从第1个位置开始获取数据,向前面局部有序进行插入
                 for(var i=1;i<length;i++){
                     //3.内层循环:获取 i位置的元素,和前面的数据依次进行比较
                     var temp=this.array[i]
                     var j=i
                     while(this.array[j-1]>temp&&j>0){
                         this.array[j]=this.array[j-1]
                         j--
                     }
                     //4.将 j位置的数据,放置 temp就可以啦 
                     this.array[j]=temp
                 }  
             }
            
            //希尔排序
            ArrayList.prototype.shellSort=function(){
                //1.获取数组的长度
                var length=this.array.length
    
                //2.初始化的增量
                var gap=Math.floor(length /2)
    
                //3.while 循环(gap不断的较小)
                while(gap>=1){
                    //4.以 gap 作为间隔,进行分组,对分组进行插入排序
                    for(var i=gap;i<length;i++){
                        var temp=this.array[i]
                        var j=i
                        while(this.array[j-gap]>temp&&j>gap-1){
                            this.array[j]=this.array[j-gap]
                            j-=gap
                        }
    
                        //5.将 j 位置的元素赋值 temp
                        this.array[j]=temp
                    }
                    //6.增量变化 /2
                    gap=Math.floor(gap/2) 
                }
            }
    
            //快速排序
            //1.选择枢纽
            ArrayList.prototype.medium = function (left,right) {
                // 1. 取出中间的位置
                var center = Math.floor((left + right)/2);
    
                // 2. 判断大小,并且进行交换
                if ( this.array[left] > this.array[center]){
                    this.swap(left , center);
                };
                if (this.array[left] > this.array[right]){
                    this.swap(left , right);
                };
                if (this.array[center] > this.array[right]){
                    this.swap(center , right);
                };
    
                // 3.将center换到right-1的位置
                this.swap(center , right - 1)
    
                return this.array[right - 1]
            };
    
            // 2. 快速排序的实现
            ArrayList.prototype.quickSort = function () {
                this.quick(0 , this.array.length - 1);
            };
    
            ArrayList.prototype.quick= function (left , right) {
                // 1. 结束条件
                if ( left >= right ){
                    return
                };
    
                // 2. 获取枢纽
                var pivot = this.medium(left , right);
    
                // 3. 定义变量,用于当前找到的位置
                var i = left;
                var j = right - 1;
    
                // 4. 开始进行交换
                while (i<j){
                     while(this.array[++i] < pivot){};
                     while (this.array[--j] > pivot){};
                     if (i < j){
                         this.swap(i , j);
                     }else{
                         break;
                     };
    
                }
                // 5. 将枢纽放置在正确的位置,i的位置
                this.swap(i ,right-1);
    
                // 6. 分而治之
                this.quick(left, i-1);
                this.quick(i + 1, right);
            };
        }
    
        //测试类
        var list=new ArrayList()
    
        list.insert(66)
        list.insert(88)
        list.insert(12)
        list.insert(87)
        list.insert(100)
        list.insert(5)
        list.insert(566)
        list.insert(23)
    
        alert(list)
        //验证冒泡排序
        list.bubbleSort()
        alert(list)
    
       //2.验证选择排序
       list.selectionSort()
       alert(list)
    
       list.insertionSort()
       alert(list)
    
       //验证希尔排序
       list.shellSort()
       alert(list)
    
       //验证快速排序
       list.quickSort()
       alert(list)
    

      

  • 相关阅读:
    梯度消失、爆炸原因及其解决方法(转)
    Learning to Rank for IR的评价指标—MAP,NDCG,MRR
    tensorflow中使用指定的GPU及GPU显存 CUDA_VISIBLE_DEVICES
    深度学习 weight initialization
    python 第三方包安装
    列表操作 -深拷贝与浅拷贝
    python排序 sorted()与list.sort() (转)
    Python 第三方库 cp27、cp35 等文件名的含义(转)
    Learning to Rank(转)
    Spring MVC异常处理
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/14124528.html
Copyright © 2011-2022 走看看