排序

作者: 饥人谷_啦啦啦 | 来源:发表于2017-07-13 02:27 被阅读0次

    1. 冒泡排序

    • 中心思想:数组内数值,从左向右两两依次比较,挑出最大值,并向后移动,移动结果,移动一轮最大值总能出现在数组最后(冒泡)

    • 算法主要的逻辑
      第一轮:数组内第一个和第二个依次比较,无论结果怎样,第二个和第三个比较,直至第n个(n为数组长度),比较了n-1次,倒数第一个数。
      第二轮:数组内第一个和第二个依次比较,无论结果怎样,第二个和第三个比较,直至第n-1个。比较了n-2次,比较的末尾是倒数第二个数
      第三轮:---
      第n+1轮: ---

    所以我们需要的变量有, 描述总共需要多少轮的变量i ,一轮需要比较多少次的变量j,我们忽视的无论结果(需要准备一个交换位置的函数)。 其中变量a 和,变量b ,均和数组的长度有关系。
    i的行为: 从 0 增加 到 arr.length, 那么很简单,for循环。
    j的行为:从0增加到arr.length for循环
    i和j 关系: i=0 ,执行 j 从0 到 arr.length-1; 所以,应该是 b循环,嵌套在a 循环内部。

    然后就可以写函数了。

    function maopao(arr){
      for(var i=0;i<arr.length;i++){
        for(var j=0;j<arr.length-1-i;j++){
          if(arr[j]<=arr[j+1]){
            
          }else{
            replace(arr,j)
          }
        }
      }
      return arr
    }
    function replace(arr,j){
      var middle= arr[j]
      arr[j]=arr[j+1]
      arr[j+1]=middle
    }
    var a=[2,8,3,32,4,9,4,8]
    console.log(maopao(a))// 注意,命名函数的时候,不允许有j+1这样的变量,同时,如果我们传进去的是非引用类型, 那么赋值是无效的。
    

    2.选择排序

    • 中心思想:把数组内的第一个值与其他值依次比较,直到发现比第一个值还小的值,记录这个小的值,再与其他值比较,一轮结束,总能选则出最小值与第一个值交换位置。

    • 主要逻辑:[a,b,c,d,e]
      第一轮:把第一个数当做最小值,最小值分别和第二个数比较,无论结果怎样,最小值与第三个数比较,。。。。直到第n个,比较了n-1次。比较的末尾是最后一个数,交换最小值与第一个值的位置。
      第二轮:从第二个值开始,重复上面的步骤。 比较次数,n-2次,比较的最后一次仍然是末尾。交换min与第二个值的位置。
      第n轮:从第n个值,重复上面的步骤。比较次数0次。交换n与第n个数。

    所以,我们需要的变量有 轮数i ,次数j ,最小值min或者记录最小值的位置indexofmin,一个交换位置的函数。

    i的行为:从0增加到arr.length, 为什么是arr.length(假设有5个数,每轮挑选出最一个最小值,要选几轮才能选完?)
    j的行为:从i+1一直比较到arr.length ,从i+2一直比较到arr.length...
    i与j的关系,首先还是嵌套.
    min的行为: min的初始值,总是等于arr[i],然后循环开始,min不停的与arr[j]比较,如果大于arr[i]则被重新赋值。

    function selectMin(arr){
      for(var i=0;i<arr.length;i++){
        var min=a[i]
        var indexofmin=i
        for(var j=i+1;j<arr.length;j++){
            if(min<=a[j]){
            }else{
              min=a[j]
              indexofmin=j
            }
        }
        replace(arr,i,indexofmin)
      }
      return arr
    }
    function replace(arr,i,indexofmin){
      var middle=arr[i]
          arr[i]=arr[indexofmin]
          arr[indexofmin]=middle
    }
    
    var a=[15,7,9,32,45,1,0,77,54]
    console.log(selectMin(a))
    

    3.插入排序

    • 中心思想:类似于起牌,把第一个数,当起的第一张牌,把第二个数当起的第三张牌,然后插到合适的位置。

    • 主要逻辑
      第一轮:起第一张牌
      第二轮:起第二张牌(数组第二个数),与第一张牌比大小,大的放在前面,小的放在后面。
      第三轮:起第三张牌(数组的第三个数),先与第二张牌比较,大则不什么都不作,小则依次和第一张比较。。。
      第n轮:起第n张牌,先与n-1比较。依次与第n-1张牌,n-2张牌比较,只要找到比n小的数,记录这个数的位置插入。

    所以,我们需要的变量有轮数i,比较的次数j ,以及记录中间最小值的indexmin。
    i的行为:从0到arr.length
    j的行为:每轮从i-1开始,与i比较。
    indexmin的行为:初始值均为i,记录 i 或[j-1]~[0](也就是最小值)的位置。

    function insert(arr){
      for(var i=1;i<arr.length;i++){
        var indexofinsert=i
            console.log(1)
          for(var j=i-1;j>-1;j--){
            if(a[i]>a[j]){
            }else{
              indexofinsert=j
            }
          }
        replace(arr,i,indexofinsert) 
      }
      return arr
    }
    
    function replace(arr,i,indexofinsert){
      arr.splice(indexofinsert,0,arr[i])
      arr.splice(i+1,1)
    }
    
    
    var a=[0,23,4]
    console.log(insert(a))
    

    相关文章

      网友评论

          本文标题:排序

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