关于桶排序和计数排序
  • 板块学术版
  • 楼主happy_zero
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/9/15 11:52
  • 上次更新2023/11/2 20:47:54
查看原帖
关于桶排序和计数排序
731925
happy_zero楼主2023/9/15 11:52

这个是计数排序:

const int N = 100010;
const int W = 100010;

int n, w, a[N], cnt[W], b[N];

void counting_sort() {
    memset(cnt, 0, sizeof(cnt));
    for (int i = 1; i <= n; ++i) ++cnt[a[i]];
    for (int i = 1; i <= w; ++i) cnt[i] += cnt[i - 1];
    for (int i = n; i >= 1; --i) b[cnt[a[i]]--] = a[i];
}

这个是桶排序:

const int N = 100010;

int n, w, a[N];
vector<int> bucket[N];

void insertion_sort(vector<int>& A) {
  for (int i = 1; i < A.size(); ++i) {
    int key = A[i];
    int j = i - 1;
    while (j >= 0 && A[j] > key) {
      A[j + 1] = A[j];
      --j;
    }
    A[j + 1] = key;
  }
}

void bucket_sort() {
  int bucket_size = w / n + 1;
  for (int i = 0; i < n; ++i) {
    bucket[i].clear();
  }
  for (int i = 1; i <= n; ++i) {
    bucket[a[i] / bucket_size].push_back(a[i]);
  }
  int p = 0;
  for (int i = 0; i < n; ++i) {
    insertion_sort(bucket[i]);
    for (int j = 0; j < bucket[i].size(); ++j) {
      a[++p] = bucket[i][j];
    }
  }
}

但是还有另一种形式的桶排序:

#include<iostream>
using namespace std;
int n,b[100000005];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        b[x]++;
    }
    for(int i=1;i<=100000000;i++){
        for(int j=1;j<=b[i];j++){
            cout<<i<<' ';
        }
    }
    return 0;
}

问:

  1. 第 2.3 份代码都是桶排序吗?我之前接触的都是第 3 种。
  2. 第 1.3 份代码有什么区别吗?如果有区别的话哪份代码更优?

在复习初赛,像看一下各个排序,然后就发现了这个问题,我目前的思考如下:

  1. 都是桶排序,不过第 2 份代码不能处理值域较大的情况
  2. 没有较大的区别,但是第一个是稳定的排序,第三个不稳定,应该是第三份代码更优

希望有大佬来教教我这个蒟蒻。

2023/9/15 11:52
加载中...