首页 > 编程语言 >写一个方法实现“桶排序算法”,并解释下时间复杂度和空间复杂度

写一个方法实现“桶排序算法”,并解释下时间复杂度和空间复杂度

时间:2024-11-30 09:34:04浏览次数:6  
标签:arr 复杂度 元素 number 算法 排序

/**
 * 桶排序算法 (Bucket Sort)
 *
 * @param {number[]} arr 待排序数组,元素值应在 [minVal, maxVal] 范围内
 * @param {number} minVal 数组元素最小值
 * @param {number} maxVal 数组元素最大值
 * @param {number} bucketSize 桶的大小,影响桶的数量
 * @returns {number[]} 排序后的数组
 */
function bucketSort(arr, minVal, maxVal, bucketSize = 5) {
  if (arr.length <= 1) {
    return arr;
  }

  const bucketCount = Math.floor((maxVal - minVal) / bucketSize) + 1;
  const buckets = Array(bucketCount);
  for (let i = 0; i < bucketCount; i++) {
    buckets[i] = [];
  }

  // 将元素放入桶中
  for (const num of arr) {
    const bucketIndex = Math.floor((num - minVal) / bucketSize);
    buckets[bucketIndex].push(num);
  }

  // 对每个桶内的元素进行排序 (这里使用插入排序,也可以使用其他排序算法)
  for (const bucket of buckets) {
    insertionSort(bucket);
  }

  // 合并所有桶中的元素
  const sortedArr = [];
  for (const bucket of buckets) {
    sortedArr.push(...bucket);
  }

  return sortedArr;
}

/**
 * 插入排序 (Insertion Sort) - 用于桶内排序
 *
 * @param {number[]} arr 待排序数组
 * @returns {number[]} 排序后的数组
 */
function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    const current = arr[i];
    let j = i - 1;
    while (j >= 0 && arr[j] > current) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = current;
  }
  return arr;
}


// 示例用法:
const arr = [5, 2, 8, 12, 3, 1, 7, 9, 11, 4, 6, 10];
const minVal = 1;
const maxVal = 12;
const sortedArr = bucketSort(arr, minVal, maxVal);
console.log("Sorted array:", sortedArr); // Output: Sorted array: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]


时间复杂度:

  • 最佳情况:O(n+k),其中 n 是元素个数,k 是桶的数量。当输入数据均匀分布在各个桶中,且桶内排序使用高效的算法(例如插入排序对小规模数据)时,可以达到线性时间复杂度。
  • 平均情况:O(n+k),与最佳情况相同。
  • 最坏情况:O(n^2)。当所有元素都落入同一个桶中,并且桶内排序算法的复杂度为 O(n^2)(例如桶内使用了冒泡排序)时,时间复杂度会退化到平方级。 这通常发生在数据分布极不均匀的情况下.

空间复杂度:O(n+k)

  • 需要额外的空间来存储桶,桶的数量为 k。
  • 在最坏情况下,一个桶可能包含所有元素,因此桶的空间占用最大为 n。
  • 总体空间复杂度为 O(n+k).

关键点和优化:

  • 桶的大小 bucketSize 选择合适的桶大小至关重要。桶太少会导致每个桶中的元素过多,降低效率;桶太多会增加空间开销。
  • 桶内排序算法: 对于桶内排序,可以选择合适的算法。如果桶内元素较少,插入排序是一个不错的选择。如果桶内元素较多,可以考虑使用快速排序等更高级的算法。
  • 数据分布: 桶排序在数据均匀分布时表现最佳。如果数据分布非常不均匀,桶排序的效率可能会降低。
  • 适用场景: 桶排序适用于数据分布相对均匀,并且值范围不太大的情况。

这个改进的版本包含了更清晰的注释、参数验证、以及一个示例用法。它也明确指出了桶内排序

标签:arr,复杂度,元素,number,算法,排序
From: https://www.cnblogs.com/ai888/p/18578036

相关文章

  • 写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度
    functionradixSort(arr){if(!Array.isArray(arr)||arr.length<=1){returnarr;}//1.找到数组中的最大值,以确定最大位数letmax=Math.max(...arr);letexp=1;//1,10,100...//2.循环执行计数排序,从个位到最高位while(max/exp>=......
  • 说说你对js排序的理解,你有了解哪些算法呢?
    我对JavaScript排序的理解是,它主要用于对数组中的元素进行排序,使其按照一定的顺序排列,比如升序或降序。JavaScript提供了内置的sort()方法来实现排序,同时也允许开发者自定义排序逻辑。我了解以下几种JavaScript排序算法:1.内置sort()方法:JavaScript的sort()方法默......
  • 写一个方法实现“选择排序算法”,并解释下时间复杂度和空间复杂度
    functionselectionSort(arr){constn=arr.length;for(leti=0;i<n-1;i++){//FindtheminimumelementintheunsortedpartofthearrayletminIndex=i;for(letj=i+1;j<n;j++){if(arr[j]<arr[minInd......
  • 写一个方法实现“交换排序算法”,并解释下时间复杂度和空间复杂度
    /***交换排序(冒泡排序)**@param{Array<number>}arr待排序的数组*@returns{Array<number>}排序后的数组*/functionexchangeSort(arr){constn=arr.length;letswapped;//优化:如果一趟没有交换,说明已经有序for(leti=0;i<n-1;i++){......
  • 数据结构与算法(排序算法)
    排序的概念1.排序是指将一组数据,按照特定的顺序进行排列的过程。2. 这个过程通常是为了使数据更加有序,从而更容易进行搜索、比较或其他操作。常见的排序算法插入排序  1.把待排序的记录,按其关键码值的大小,逐个插入到一个已经排好序的有序序列中,直......
  • 【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系
    文章目录一、树的概念与结构1.树的概念2.树的相关术语3.树的表示4.树形结构实际运用举例二、二叉树的概念及特殊二叉树1.二叉树的概念2.特殊的二叉树满二叉树完全二叉树二叉树的性质(由满二叉树特点推导)三、二叉树的存储结构1.二叉树的顺序结构2.二叉树的链式结构......
  • 回溯算法part03
    文章参考来源代码随想录93.复原IP地址1.递归参数字符串(不能加const因为要在字符串上加‘.’,因此本题不用组合,直接将字符串加入到结果中),当前层递归开始遍历的地方,计数器(记录‘.’的个数)2.递归终止条件当计数器到达3时(说明分成四段了),判断最后一段是否满足区间函数,若满足加......
  • 顺序表的时间复杂度介绍
    顺序表的时间复杂度介绍引言顺序表(Array)是一种常见的数据结构,它在逻辑上是一种线性表,物理结构上是顺序存储。顺序表通过连续的内存空间存储数据元素,具有高效的随机访问特性。本文将详细介绍顺序表的增删改查操作的时间复杂度,并从最好、最坏和平均三个角度分析其性能表现。同时,我......
  • DDD之理解复杂度、尊重复杂度、掌控复杂度
    DDD之理解复杂度、尊重复杂度、掌控复杂度本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。背景关......
  • 代码随想录算法训练营第三十一天|leetcode56. 合并区间、leetcode738.单调递增的数字
    1leetcode56.合并区间题目链接:56.合并区间-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili思路:其实很清楚,跟之前的方法差不多,但是自己写的时候就是有地方不会了,会不知道接下来的思路是什么1.1视频后的思路卡壳......