首页 > 其他分享 >2.6.桶排序

2.6.桶排序

时间:2025-01-11 12:58:15浏览次数:3  
标签:arr int 复杂度 元素 数组 排序 2.6

桶排序

桶排序也是一种非常快的排序算法,但是对于个别数组中某个元素比较大的情况比较费内存。它的实现分为三个步骤:

第一步,根据数组创建桶。具体桶的个数取决于数组中元素的大小,所谓桶其实也是一个数组,只不过桶的索引代表数组的元素,而索引值代表在原数组中此元素的个数,例如对于需要排序的数组{1,2,3,5}而言,需要创建一个桶,计数完成后为{0,1,1,1,0,1}

第二步,对数组进行计数,计得的数存储到桶中,也就是把元素的大小当作桶的索引,从这里就可以看出来,桶的大小取决于数组中元素的最大值,而在传参的时候也要传入一个参数为数组中元素的最大值。当然这也是可选的,也可以传入数组之后再用max_element函数计算出来,而且对于大多数需要排列的数组,多出来的这点时间复杂度不值一提。

第三步,就是根据桶进行排序了,这步就是第二步的反向操作。

#include <iostream>
#include <vector>
using namespace std;

void bucketSort(vector<int>& arr, int maxValue) {
    if (arr.empty()) return;
	//1.创建桶
    int n = arr.size();
    vector<int> bucket(maxValue + 1, 0);
	//2.计数
    for (int i = 0; i < n; i++) {
        bucket[arr[i]]++;
    }
	//3.排序
    int index = 0;
    for (int i = 0; i <= maxValue; i++) {
        while (bucket[i] > 0) {
            arr[index++] = i;
            bucket[i]--;
        }
    }
}

int main() {
    vector<int> arr = { 3, 2, 1, 4, 5, 6, 7, 8, 9, 10 };
    int maxValue = *max_element(arr.begin(), arr.end());
    bucketSort(arr, maxValue);
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

时间和空间复杂度分析:
  • 时间复杂度: O(n + k),其中n为数组中元素个数,k为数组中最大元素+1
    • 用于创建桶。
    • 用于填充桶。
    • 用于重建排序后的数组。
  • 空间复杂度: O(k)
    • 主要用于存储桶向量。

标签:arr,int,复杂度,元素,数组,排序,2.6
From: https://blog.csdn.net/m0_60046831/article/details/145073106

相关文章

  • 二分+排序
    https://codeforces.com/contest/2053/problem/Dhttps://blog.csdn.net/weixin_61825750/article/details/144799098#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#defineendl'\n'us......
  • 2024.12.6(SpringBoot知识点总结)
    2.1.3编写SpringBoot引导类要通过SpringBoot提供的引导类起步SpringBoot才可以进行访问packagecom.itheima;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclas......
  • 124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
    目录1.小区间优化测试代码运行结果2.非递归的解决方法(重要!)递归产生的问题一般来说,递归改非递归有两种方法算法分析递归产生的二叉树栈的示意图先写代码框架再填写细节部分1.小区间优化回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及......
  • 冒泡排序:初学者的必经之路
    ......
  • LeetCode:83.删除排序链表中的重复元素
    LeetCode:83.删除排序链表中的重复元素classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}vardeleteDuplicates=function(head){letp=head//head......
  • 多数元素(排序)
    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2思路:如果将数组 n......
  • C/C++ 数据结构与算法【排序】 常见7大排序详细解析【日常学习,考研必备】带图+详细代
    常见7种排序算法冒泡排序(BubbleSort)选择排序(SelectionSort)插入排序(InsertionSort)希尔排序(ShellSort)归并排序(MergeSort)快速排序(QuickSort)堆排序(HeapSort)计数排序(CountingSort)算法复杂度1、冒泡排序冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比......
  • python SQLAlchemy ORM——从零开始学习03 如何针对数据库信息进行排序
    03如何进行排序3-1准备工作:因为要排序,所以需要随机多谢数据,model见后文。也需要random进行随机frommodelimportUser,Enginefromsqlalchemy.ormimportsessionmakerimportrandomSession=sessionmaker(bind=Engine)session=Session()defadd_random():na......
  • LeetCode算法题:删除排序链表中的重复元素
    题目描述下面是给定的一段代码 /***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val......
  • Linq中的对数据排序 (C#):OrderBy、OrderByDescending、ThenBy、ThenByDescending
    排序操作基于一个或多个属性对序列的元素进行排序。第一个排序条件对元素执行主要排序。通过指定第二个排序条件,可以对每个主要排序组内的元素进行排序。每个 Student 都有年级、主要院系和一系列分数。 Teacher 还有一个 City 属性,用于标识教师的授课校区。 Department......