计数排序

思想:计数排序其实是桶排序的一种特殊情况。所处排序范围是固定的,比如最大值是 k,我们就可以把数据划分成 k 个桶。每个桶内的数据值都是相同的,省掉了桶内排序的时间。这里的k是小于数据总数的。

代码实现

// 计数排序
void countSort(int a[], int n) {
    if (n <= 1) {
        return;
    }
    
    // 求解最大值
    int max = a[0];
    for(int i = 1; i < n; i++) {
        if (max < a[i]) {
            max = a[i];
        }
    }
    
    // 初始化数组, 用来计数
    int c[max];
    for (int i = 0; i <= max; i++) {
        c[i] = 0;
    }
    
    // 开始计数, 计算每个桶内的个数
    for (int i = 0; i < n; i++) {
        c[a[i]]++;
    }
    
    // 依次做累加, 实现排序
    for (int i = 1; i <= max; i++) {
        c[i] = c[i - 1] + c[i];
    }
    
    // 临时数组, 用来排序
    int r[n];
    for (int i = n - 1; i >= 0; i--) {
        int index = c[a[i]] - 1;
        r[index] = a[i];
        c[a[i]]--;
    }
    
    // 将临时数组值, 赋值给原始数组
    for (int i = 0; i < n; i++) {
        a[i] = r[i];
    }
}

使用

int a[] = {2, 5, 3, 0, 2, 3, 0 ,3};
    int num = sizeof(a) / sizeof(int);
    countSort(a, num);
    
    for (int i = 0; i < num; i++) {
        printf("%d\n", a[i]);
    }

你可能感兴趣的:(计数排序)