排序算法总结

128 阅读2分钟

选择排序

快速排序

归并排序

计数排序

冒泡排序:

第一轮遍历数组,比较两个相邻的元素,把大的交换到后边,这样第一轮下来,最后一个位置就是最大的元素。

第二轮遍历数组,还是从索引0开始比较相邻位置的元素,把大的换到后边,但是不用管最后一个位置的元素,因为它在上一轮已经定好了位置,不需要浪费比较次数了。这样第二轮下来,倒数第二个位置就是第二大的元素。

以此类推。所以需要双重循环。

外层循环控制一共要遍历多少轮,每一轮的结果是确定好一个位置的元素,所以假如一共有5个元素,5个坑,从最后一个坑开始,一直到正数第二个坑,要确定四个坑,因为正数第二坑定好了,那第一个位置自然就是被剩下的最小的那个了。所以外层要循环 数组长度-1 次。

内层循环是每次从i=0的位置开始,比较它和后一个位置元素的大小。每一轮外层循环里,内层要循环的次数是不一样的,因为内层要比较的次数越来越少 ,这与外层循环的控制次数有关。具体可以举例。

function sort(array){
  for(let i=1;i<array.length;i++){
    for(let j=0;j<array.length-i;j++){
      if(array[j]>array[j+1]){
        let temp=array[j]
        array[j]=array[j+1]
        array[j+1]=temp
      }
    }
  }
  return array
}

插入排序

类似于整理扑克牌,每次拿到一张牌,把它插入到合适的位置,从第一张只有一张牌,是自然有序的,以后每拿到一张,就插入到合适的位置,所以每次都是把当前牌插入到一个有序数组里。

所以把数组i=0项看成是自然有序的,遍历数组从i=1开始的所有项。把当前项i插入到之前的有序数组里,具体:从j=i-1开始,一直遍历到j=0,每一项都和当前项i比较,如果比当前项大,那就把j的元素换到后边,覆盖到j+1的位置;然后j往前走,直到有一次当前项更大,就跳出里层循环,找到了当前项应该插入的位置。即把j+1的位置覆盖为当前项

function sort(arr){
  for(let i=1;i<arr.length;i++){
    let target=arr[i]
    for(var j=i-1;j>=0;j--){
      if(arr[j]>target){
        arr[j+1]=arr[j]
      }else{
        break
      }
    }
    arr[j+1]=target
  }
  return arr
}