zoukankan      html  css  js  c++  java
  • 算法:桶排序

    桶排序相信很多人都听说过吧,无比经典的一个排序算法。

    例题

    洛谷1177 排序

    题目描述
    将读入的 N 个数从小到大排序后输出。

    输入格式
    第 1 行为一个正整数 N。
    第 2 行包含 N 个空格隔开的正整数 a[i],为你需要进行排序的数,数据保证了a[i]不超过10^9。

    输出格式
    将给定的 N个数从小到大输出,数之间用空格隔开。

    输入输出样例
    输入

    5
    4 2 4 5 1
    

    输出

    1 2 4 4 5
    

    说明提示
    对于20% 的数据,有 N <= 10^3。
    对于100% 的数据,有 N <=10^5 。

    桶排序

    其实桶排序是由鸽巢排序推理过来的,实现起来其实就是以一个范围为一个鸽巢,就是将a_min到a_max划分成几个范围,之后把所有数放到相应的桶内,接着再分别对每个桶进行排序就行了。思路其实很简单。

    这里再算一下算法时间复杂度我们可以看到大概是O(n + m)级别的。

    代码

    # include <cstdio>
    # include <cmath>
    # include <cstring>
    # include <algorithm>
    # include <vector>
    
    using namespace std;
    
    const int N_MAX = 100000, M_MAX = 1000000;
    const int BUCKET_GAP = 1000;
    
    int n;
    int a[N_MAX + 10];
    vector <int> bucket[M_MAX + 10];
    
    void bucketSort()
    {
    	int a_max = -2e9, a_min = 2e9;
    	for (int i = 1; i <= n; i++) {
    		a_max = max(a_max, a[i]);
    		a_min = min(a_min, a[i]);
    	}
    	int bucket_num = (a_max - a_min) / BUCKET_GAP;
    	for (int i = 0; i <= bucket_num; i++)
    		bucket[i].clear();
    	for (int i = 1; i <= n; i++)
    		bucket[(a[i] - a_min) / BUCKET_GAP].push_back(a[i]);
    	int tmp = 0;
    	for (int i = 0; i <= bucket_num; i++) {
    		sort(bucket[i].begin(), bucket[i].end());
    		for (int j = 0; j < (int) bucket[i].size(); j++)
    			a[++tmp] = bucket[i][j];
    	}
    }
    
    int main()
    {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++)
    		scanf("%d", &a[i]);
    	bucketSort();
    	for (int i = 1; i <= n; i++)
    		printf("%d ", a[i]);
    	printf("
    ");
    	return 0;
    }
    
  • 相关阅读:
    Understanding about Baire Category Theorem
    Isometric embedding of metric space
    Convergence theorems for measurable functions
    Mindmap for "Principles of boundary element methods"
    Various formulations of Maxwell equations
    Existence and uniqueness theorems for variational problems
    Kernels and image sets for an operator and its dual
    [loj6498]农民
    [luogu3781]切树游戏
    [atAGC051B]Three Coins
  • 原文地址:https://www.cnblogs.com/000zwx000/p/12516203.html
Copyright © 2011-2022 走看看