简单的排序

199 阅读3分钟

小弟复习技术忙,一大家子需人养,前年躺平今年卷,活到退休梦一场。

大家偏爱搞算法,计科出生也难懂,后浪推着前浪走,前浪努力才能不死在沙滩上。

躺平就是伪命题,除非家里有钱烧,今后努力学到死,孩子才能不饿死。

先聊聊简单排序

冒泡排序

先说思路,给定一组数据例如 [ 9,1,2, 3, 4, 5, 6, 7, 8]从小到大排序,我们操作数组长度-1 次以下操作

1.从初始位置出发 对比相邻的两个数据

2.如果后者比前者小,我们就把后者和前者交换,这样每次操作都能保证最最大的数在后面

3.如上操作直到顶

4.再回到初始位置 重复上面的操作

这里面需要注意的是,根据如上步骤,当我们已经推倒顶的数不需要再次比较了。 已经被推倒顶的数 就是 数组长度 - 操作过的次数 - 1了。

另外 如 我们例子的数据,其实我门发现 第二次 操作完成之后 也就拍好了,之后再操作就是多余的。而对应的是第二次之后 在步骤2里都不会找到后者比前者小的数据,也就不会发生交换。因此我门可以优化一下子,加一个状态标示。在某次操作标示值没有变化之后就跳转操作,因为也没啥意义了。

只需要记住四个步骤 我们就可以 拥有 一个冒泡排序

1.确定

 // 冒泡排序
const bubble_sort= (list)=>{
     for(let i=0;i<list.length-1;i++){
       let change= false
        for(let j=0;j<list.length-1-i;j++){
            if(list[j]>list[j+1]){
              [list[j+1], list[j]] = [list[j], list[j+1]]
              change = true
            }
        }
        if(!change){
          return
        }
        console.info('bubbing_sort', list)
     }
}

时间复杂度

最坏情况O(n^2),最好的就是O(n)

选择排序

先说思路,给定一组数据例如 [ 9,1,2, 3, 4, 5, 6, 7, 8]从小到大排序,我们操作不知道数组长度-1 次以下操作

1.找到当前数据里最小的,定义一个变量,有比它小的就换成小的那个

2.将小数放到新数组里,并从原来的数组里删除

3.重复上述操作

这里我们发现一个问题就是需要操作2多余的数组其实会增加我们整个排序的空间复杂度,得想办法优化一下子

1.假设操作数组0位置

2.找到比0位置小的就把这个数和0位置的数交换

3.重复上述操作

这次优化呢,并不需要操作一个新数组,也不需要定义一个临时变量,因为数组0位置代替了这两个功能。当然了不能只操作0位置,所以需要一个循环,操作数组长度-1次

// 选择排序
const search_sort = (list) => {
  for (let i = 0; i < list.length - 1; i++) {
    for (let j = i; j < list.length; j++) {
      if (list[i] > list[j]) [list[i], list[j]] = [list[j], list[i]]
    }
    console.info('search_sort', list)
  }
}

时间复杂度

 O(n^2)
 

插入排序

先说思路,给定一组数据例如 [ 9,1,2, 3, 4, 5, 6, 7, 8]从小到大排序,我们操作不知道数组长度-1 次以下操作

1.拿出来一个数例如1位置的1

2.将这个数与前面的数对比,如果比1大,就将此位置和1位置交换 其实就是向后移动一位,直到找不到比1大的

3.将1位置的数据放到最终查找的位置后一位

4.循环上述操作

// 插入排序
const insert_sort = (list) => {
  for (let i = 1; i < list.length; i++) {
      let j=i-1
      let tmp = list[i]
      while(j>=0&&tmp<list[j]){
        list[j+1]=list[j]
        j-=1
      }
      list[j+1]=tmp
      console.info('insert_sort', list)
  }
}

时间复杂度

最坏情况O(n^2)