排序

作者: 饥人谷_啦啦啦 | 来源:发表于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))

相关文章

  • 【恋上数据结构与算法二】(一)排序(Sorting)

    排序方法 冒泡排序 选择排序 堆排序 插入排序 归并排序 快速排序 希尔排序 计数排序 基数排序 桶排序 初识排序...

  • 排序-冒泡排序

    排序系列传递门 排序—选择排序排序—快速排序排序—插入排序排序-希尔排序(待完善)排序—归并排序(待完善)排序—基...

  • 排序

    冒泡排序: 冒泡排序 选择排序: 插入排序: 希尔排序: 归并排序: 快速排序: 堆排序: 计数排序: 桶排序: ...

  • Java | 10种排序算法

    冒泡排序 选择排序 插入排序 希尔排序 计数排序 基数排序 堆排序 归并排序 快速排序 桶排序

  • 常见的排序

    冒泡排序: 选择排序: 插入排序: 快速排序: 希尔排序: 归并排序: 堆排序: 计数排序: 桶排序: 基数排序:

  • 002--20200409刷题

    冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序

  • 排序

    排序 符号:Θ 插入排序 选择排序 堆排序 归并排序 冒泡排序 快速排序 桶排序 基数排序 计数排序 插入排序 插...

  • 排序 -- 选择/插入

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 选择排序与插入排序 ...

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • Java 常见的 8 种排序算法(内排序)

    排序分类 内部排序 插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:直接选择排序、堆排序...

网友评论

      本文标题:排序

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