[路飞]_小白算法学习之计数排序~

412 阅读1分钟

计数排序

如下图:

1.png

原始数组:即需要进行排序的数组
计数数组:实现排序需求需要的中间数组

通过原始数组中寻找最大的元素,作为计数数组的长度进行创建数组
随后开始进行计数

2.png

最后再对计数素组进行遍历循环按下标获取元素,即可实现排序

贴代码~

function countSort(arr){
    let maxValue = 0;
    for(let i = 0; i< arr.length; i++){
        if(maxValue < arr[i]){
            maxValue = arr[i] //获取最大值
        }
    }
    // 用数组最大值进行 计数数组的创建 +1 是因为数组是从0开始的
    let bucket = new Array(maxValue + 1) 
    for(let i = 0; i < arr.length; i++){
        let num = arr[i]
        if(bucket[num] ==null){
            bucket[num] = 1
        }else{
            bucket[num] += 1
        }
    }

    let arrCurrIndex = 0;
    //遍历计数素组
    for(let i=0; i<bucket.length;i++){
    //遍历计数素组 由于同一个数字的计数会大于1 所以对单个元素进行循环添加
        while(bucket[i]>0){
            let num =i 
            arr[arrCurrIndex++] = num;
            bucket[i] -= 1
        }
    }
}

桶排序

桶排序是一种的计数排序衍生出来的方式
计数排序是对单个元素进行单个计数
那么桶排序是对单个元素通过对桶的大小进行放置,对大通进行元素大小比对塞入小桶后,对小桶内进行排序 贴代码~

function bucketSort(arr,bucketCount){
  //bucketCount 每个桶里的元素的个数 
  let result = [],
  minValue = arr[0],
  maxValue = arr[0];

  for(let i = 0; i < arr.length; i++){
    if(arr[i] < minValue){
      minValue = arr[i]
    }
    if(arr[i] > maxValue){
      maxValue = arr[i]
    }
  }
  // bucketSize 桶整个的大小
  let bucketSize = Math.floor((maxValue - minValue)/ bucketCount) + 1
  //  创建桶数组(计数素组)
  let bucket = new Array(bucketSize)
  for(let i = 0; i<bucket.length; i++){
    bucket[i] = []
  }
    //  对每个元素进行桶分类(即将一个桶里应放buckerCount个元素)
  for(let i = 0; i<arr.length; i++){
    bucket[Math.floor((arr[i]-minValue)/bucketCount)].push(arr[i])
  }

  for(let i = 0; i<bucket.length;i++){
    //这里对每个小桶 里的元素 进行插入排序
    insetionSort(bucket[i])
    for(let j = 0; j < bucket[i].length; j++){
      result.push(bucket[i][j])
    }
  }
}
function insetionSort(arr){
  let len = arr.length,prev,current;
  for(let i = 1; i < len ; i++){ 
    prev = i - 1
    current = arr[i]
    while( prev >=0 && arr[prev]>current){
      arr[prev+1] = arr[prev]
      prev -- ;
    }
    arr[prev+1] = current
  }
}