algoalgo-world
algoalgo-world/sort/gravity-sort
sort/gravity-sort

重力排序

最好
O(n * k)
平均
O(n * k)
最坏
O(n * k)
空间
O(k)
稳定性
不适用
方式
分布

k 是取值范围

选一种语言就能看到代码

def gravity_sort(a):
    if not a:
        return
    top = max(a)
    levels = [0] * top
    for value in a:
        for level in range(value):
            levels[level] += 1
    for i in range(len(a)):
        beads = sum(1 for level in range(top) if levels[level] > i)
        a[len(a) - 1 - i] = beads
function gravitySort(a) {
  if (a.length === 0) return;
  const top = Math.max(...a);
  const levels = new Array(top).fill(0);
  for (const value of a) {
    for (let level = 0; level < value; level++) levels[level]++;
  }
  for (let i = 0; i < a.length; i++) {
    let beads = 0;
    for (let level = 0; level < top; level++) {
      if (levels[level] > i) beads++;
    }
    a[a.length - 1 - i] = beads;
  }
}
void gravity_sort(int a[], int n, int top) {
    int* levels = calloc(top, sizeof(int));
    for (int i = 0; i < n; i++) {
        for (int level = 0; level < a[i]; level++) levels[level]++;
    }
    for (int i = 0; i < n; i++) {
        int beads = 0;
        for (int level = 0; level < top; level++) {
            if (levels[level] > i) beads++;
        }
        a[n - 1 - i] = beads;
    }
    free(levels);
}
void gravity_sort(std::vector<int>& a) {
    if (a.empty()) return;
    int top = *std::max_element(a.begin(), a.end());
    std::vector<int> levels(top, 0);
    for (int value : a) {
        for (int level = 0; level < value; level++) levels[level]++;
    }
    for (size_t i = 0; i < a.size(); i++) {
        int beads = 0;
        for (int level = 0; level < top; level++) {
            if (levels[level] > static_cast<int>(i)) beads++;
        }
        a[a.size() - 1 - i] = beads;
    }
}
static void GravitySort(int[] a) {
    if (a.Length == 0) return;
    int top = a.Max();
    int[] levels = new int[top];
    foreach (int value in a) {
        for (int level = 0; level < value; level++) levels[level]++;
    }
    for (int i = 0; i < a.Length; i++) {
        int beads = 0;
        for (int level = 0; level < top; level++) {
            if (levels[level] > i) beads++;
        }
        a[a.Length - 1 - i] = beads;
    }
}
static void gravitySort(int[] a) {
    if (a.length == 0) return;
    int top = Arrays.stream(a).max().getAsInt();
    int[] levels = new int[top];
    for (int value : a) {
        for (int level = 0; level < value; level++) levels[level]++;
    }
    for (int i = 0; i < a.length; i++) {
        int beads = 0;
        for (int level = 0; level < top; level++) {
            if (levels[level] > i) beads++;
        }
        a[a.length - 1 - i] = beads;
    }
}
先跑一遍,再读源码