算法排序总结

    //双重默认值
//    function fetUrl(url,{method="GET"}={}){
//        console.log(method,"---")
//    }
//    fetUrl("11111",{method:"post"})

//     function m1({x=0,y=0}={}){
//         return [x,y]
//     }
//     function m2({x,y}={x:0,y:0}){
//         return [x,y]
//     }

//      console.log(m1(),m2())//[0,0]
//      console.log(m1({x:1,y:2}),m2({x:2,y:3}))

// var a = [ -22,-98, -8, -3,  5, 9, 33];
// function findMinAbsOfArr(arr) {
//     let min=arr[0]
//      for( var i=0;i<a.length;i++){
//          if(Math.abs(a[i])<min){
//             min=Math.abs(a[i])
//              return min
//          }
//      }
// }
// console.log(findMinAbsOfArr(a))


//比较两个数的大小
function greater(v,w){
   return Math.abs(v)-Math.abs(w)>0
}
//交换数组i与j的值
function each(a,i,j){
  var temp=a[i]
  a[i]=a[j]
  a[j]=temp
}

// 冒泡排序
var arr = [ -22,-98, -8, -3,  5, 9, 33];
 function sort(arr){
    for(var i=arr.length-1;i>0;i--){
        for(var j=0;j<i;j++){
            if(greater(arr[j],arr[j+1])){
               each(arr,j,j+1)
            }
        }
    }
    return arr 
 }
 console.log(sort(arr),"soer")

//选择排序
var  selectarr = [ -22,-98, -8, -3,  5, 9, 33];
  //先设置一个最小值然后拿最小值与其他元素比较
  function selectSort(arr){
       for(let i=0;i<=arr.length-2;i++){ //排除最小值
           let minIndex=i //假设为最小值
           for(let j=i+1;j<=arr.length-1;j++){
            if(greater(arr[minIndex],arr[j])){
                minIndex=j//交换索引
             }
           }
           each(arr,i,minIndex)//变换位置
       }
       return arr
  }

 console.log(selectSort(selectarr),"selectSort") 
//插入排序
var  insertArr = [ -22,-98, -8, -3,  5, 9, 33];
function insertSort(arr){
    for(let i=1;i<arr.length;i++){//全部一组
         for(let j=i;j>0;j--){//前面排好的一组
             if(greater(arr[j-1],arr[j])){
                each(arr,j-1,j)
             }else{
                 break
             }
         }
    }
  return arr
}
console.log(insertSort(insertArr),"insertSort")
//希尔排序
 var  shellArr = [ -22,-98, -8, -3,  5, 9, 33];
 function shellSort(arr) {
     //根据数组arr的长度确定增长量h
     let h=1
     while(h<arr.length/2) {
         h=2*h+1
     }
     //希尔排序
     while(h>=1){// 7,3
        //寻找待插入元素的值
        for(let i=h;i<arr.length;i++){
            // 寻找要比较的值(前面已经拍好的一组寻找)
            for(let j=i;j>=h;j-=h){
                //待插入元素是a[j],a[j-h]
                // console.log(j,arr[j-h],arr[j])
                if(greater(arr[j-h],arr[j])){
                    each(arr,j-h,j)
                }else{
                    break;
                }
            }
        }
       //最小值h
        h=parseInt(h/2)
     }
     return arr
 }
 console.log(shellSort(shellArr),"shellSort")
//归并排序
   let newArr=[]
   let margeArr=[ -22,-98, -8, -3,  5, 9, 33]
   function  margeSort(arr) {
      let lo=0;
      let hi=arr.length-1;
     return reSort(arr,lo,hi)
   }
   function reSort(arr,lo,hi){
       //安全性校验
        if(hi<=lo){
            return;
        }
      //进行拆分
      let mid=lo+parseInt((hi-lo)/2)//
      //递归调用左子组
       reSort(arr,lo,mid) // mid为 3,1,0
      //递归调用右子组
       reSort(arr,mid+1,hi)// mid为 3,5
    //   console.log(lo,mid,hi,"reSort")
      // 0 0 1  mid=0
      // 0 1 3  mid=1
      // 0 3 6  mid=3
      // 4 5 6  mid=5
      // 0 3 6  mid=3
      // 4 4 5  
      // 2 2 3  
     //合并
    return merge(arr,lo,mid,hi)
   }
   function merge(arr,lo,mid,hi){
       //定义三个指针
       let i=lo
       let p1=lo
       let p2=mid+1
    //    console.log(p1,mid,p2,hi)
      //遍历,移动p1指针与p2指针比较对应索引的值找出最小的值放到辅助数组中
      while(p1<=mid && p2<=hi ){
          if(greater(arr[p2],arr[p1])){//找到p1最小
            newArr[i++]=arr[p1++]
            // debugger
          }else{
            newArr[i++]=arr[p2++]
          }
      }
      //如果p1没有走完就移动p1指针
      while(p1<=mid){
        newArr[i++]=arr[p1++]
      }
      //如果p2没有走完就移动p1指针
      while(p2<=hi){
        newArr[i++]=arr[p2++]
      }
    //console.log(newArr,"111")
      //把辅助数组拷贝到原数组中
      for(let index=lo;index<=hi;index++){
          arr[index]=newArr[index]
      }
     return arr
   }
  console.log(margeSort(margeArr),"margeSort") 
//快速排序
let fastAre=[ 2,1,4,3]
function fastSort(arr){
    let lo=0;
    let hi=arr.length-1
   return restSort(arr,lo,hi)
}
function restSort(a,lo,hi){
   //安全性校验
   if(hi<=lo){
       return
   }
   //返回分界值切分后位置变化的索引
   let [partitions,arr]=partition(a,lo,hi)
  console.log(partitions,arr,"0000")
   //让左子组有序
   restSort(a,lo,partitions-1)

   //让右子组有序
   restSort(a,partitions+1,hi)

   return a
}
//切分函数
function  partition(a,lo,hi) {
    //确定分界值(基准值)
  let key=a[lo]
    //定义两个指针,分别指向最小索引与最大索引的后一位
  let left=lo
  let right=hi+1
  //进行对指针的移动
    while(true){
        //从右向左扫描
         while(greater(a[--right],a[key])){
              if(right===lo){
                  break
              }
         }
        //从左向右扫描
        while(greater(a[key],a[++left])){
             if(left===hi){
               break
             }
         }
        //如果左指针与右指针重合则停止 否则左右交换位置
        if(left>=right){
          return a
          break 
        }else{
            each(a,left,right)
        }
    }
     //基准值与中间值交换位置
    each(a,lo,right)
    return [right ,a]
}
// console.log(fastSort(fastAre),"fastSort")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值