算法

作者: 99ZY | 来源:发表于2021-11-28 00:10 被阅读0次

【原创】
以下是自己写的某些算法的JS实现

快排 (一)

      function quickSort(arrData) {
                var arr = arrData.slice();
                var left = 0,
                    right = arr.length - 1
                if (right <= left) return arr;
                var pivot = arr[0]
                while (left < right) {
                    while (arr[right] >= pivot && left < right) {
                        right--
                    }
                    arr[left] = arr[right];
                    if(left<right){
                        left++;
                    }
                    while (arr[left] < pivot && left < right) {
                        left++
                    }
                    arr[right] = arr[left]
                    right--;
                }
                arr[left] = pivot;
                let leftArr = arr.slice(0, left);
                let rightArr = arr.slice(left + 1);
                return quickSort(leftArr).concat(pivot).concat(quickSort(rightArr));                 
            }

快排(二)

function quickSort(arrData,left,right) {
   var arr = arrData;
   left = left||0,
       right = right||arr.length - 1;
   var lastRight = right;
   var lastLeft = left;

   if (right < 1) return [];
   var pivot = arr[left];
   while (left < right) {
       while (arr[right] >= pivot && left < right) {
           right--
       }
       
       if(left<right){
           arr[left] = arr[right];
           left++;
       }
       while (arr[left] < pivot && left < right) {
           left++
       }
       arr[right] = arr[left]
       right--;
   }
   arr[left] = pivot;
   let rightArr,leftArr;
   if(left + 1 < lastRight){
       rightArr = quickSort(arr,left + 1,lastRight);
   }else if(left + 1 === lastRight){
       rightArr = [arr[left+1]]
   }else{
       rightArr = [];
   }
   if(lastLeft < left-1){
       leftArr = quickSort(arr,lastLeft,left-1)
   }else if(lastLeft === left-1){
       leftArr = [arr[lastLeft]]
   }else{
       leftArr = [];
   }
   return [...leftArr,(pivot),...rightArr];                 
}

希尔排序

 function hellSort(arr){
    let len = arr.length;
    let gap = Math.floor(len/2),i = 0,j=0,k;
    while(gap >= 1){
        i = 0;
        while(i<gap){
            j=i;
            while(j<len){
                k=j;
                while(arr[k] > arr[k+gap] && k+gap<len && k>=0){
                    [arr[k],arr[k+gap]] = [arr[k+gap],arr[k]];
                    k -= gap;
                }
                j += gap;

            };
            i++;
        }
        gap = Math.floor(gap/2);
    }
    return arr;
}

插排

// 插入排序
function insertSort(arrData){
     let arr = arrData;
     let i=1,k;
     while(i<arr.length){
         
         k = i;
         let temp = arr[i];
         while(temp<arr[k-1] && k >= 1){             
            arr[k] = arr[k-1]
             k--;
         }
         arr[k] = temp;
         i++;
     }
     return arr;
}

二分插排

// 二分查找插入 插入排序的优化
function binaryInsert(arrData){
    var arr = arrData;
    let k,i=1,j; //从第二个位置开始
    while(i<arr.length){
        k = Math.floor(i/2);
        if(arr[i] < arr[k]){
            while(arr[i] < arr[k] && k>=0){
                k--;
            }
        }
        if(arr[i] > arr[k]){
            while(arr[i] > arr[k] && k<i){
                k++;
            }
        }
        
        j=i;
        let temp = arr[j];
        while(j>k && j>=1){
            arr[j] = arr[j-1] ;
            j--;
        }
        arr[j] = temp;
        i++;
    }
    return arr;
}

归并排序

function concatSort(arr){
    let gap = 1,i=0;
    let t = 2;
    let len = arr.length;
    while(gap < len){
        let resArr =[];
        i=0;
        while(i < len){
            let start1 = i;
            let end1 = Math.min(start1+gap-1, len-1);

            let start2 = Math.min(end1+1,len-1);
            let end2 =  Math.min(start2 + gap-1,len-1);

            if(end1 >= len-1){
                // 最后一个不成对出现,
                // 没有start2 不排序
                while(start1 <= end1 ){
                    resArr[i] = arr[start1++];
                    i++;
                }
            }else{
                // 成对的比较,拿出最小的,放到一个数组里面
                while(start1 <= end1 && start2 <= end2 ){
                    resArr[i] = arr[start1] <= arr[start2] ? arr[start1++]:arr[start2++];
                    i++;
                }
                while(start1 <= end1){
                    resArr[i] = arr[start1++];
                    i++;
                }
                while(start2<= end2){
                    resArr[i] = arr[start2++];
                    i++;
                }
            }

         }
         arr = resArr;
        gap*=t;
    }
    return arr;
}

相关文章

  • 匈牙利算法

    算法思想 算法流程 算法步骤 算法实现 python 算法应用

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 机器学习算法

    机器学习的算法分监督算法和无监督 算法。监督算法包括回归算法,神经网络,SVM;无监督算法包括聚类算法,降维算法。...

  • 字符串匹配

    BF 算法和 RK 算法BM 算法和 KMP 算法

  • 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

    常见的垃圾回收算法有: 标记-清除算法、复制算法、标记-整理算法、分代收集算法 标记-清除算法 标记—清除算法包括...

  • 头条-手撕代码

    [toc] 图算法 以及最短路径算法 树算法 手写LRU 排序算法 链表算法

  • 关于一些算法

    我们平常说的算法按照使用方向加密算法,排序算法,搜索算法,优化算法,音视频处理算法,图片处理算法 1.加密解密算法...

  • 给我巨大影响的技术书籍

    算法《算法概论》《算法设计与分析基础》 Anany Levitin《算法引论》Udi Manber《算法导论》《什...

  • 缓存相关

    cache淘汰算法:LIRS 算法 缓存那些事 Redis缓存淘汰算法,LRU算法,LRU算法讲解

  • LZW压缩算法

    参考链接:超级简单的数据压缩算法—LZW算法压缩算法——lzw算法实现LZW算法 LZW 压缩算法正确图解

网友评论

      本文标题:算法

      本文链接:https://www.haomeiwen.com/subject/iblwtrtx.html