编辑代码

#include<iostream>
#include <stdio.h>
using namespace std;
#define N 7       //待排序序列中的元素个数
#define MAX 100   //待排序序列中的最大值不能超过 100
//找到数组中的最大值
int getMax(int list[]) {
    int i, max = list[0];
    for (i = 1; i < N; i++) {
        if (list[i] > max)
            max = list[i];
    }
    return max;
}

void countingSort(int list[]) {
    int i;
    //第 1 步,找到序列中的最大值
    int max = getMax(list);
    //第 2 步,创建一个数组,长度至少为 max+1,并初始化为 0
    int array[MAX] = { 0 };
    int output[N] = { 0 };
    //第 3 步,统计各个元素的出现次数,并存储在相应的位置上
    for (i = 0; i < N; i++) {
        array[list[i]]++;
    }
    //第 4 步,累加 array 数组中的出现次数
    for (i = 1; i <= max; i++) {
        array[i] += array[i - 1];
    }

    //第 5 步,根据 array 数组中的信息,找到各个元素排序后所在位置,存储在 output 数组中
    for (i = N - 1; i >= 0; i--) {
        output[array[list[i]] - 1] = list[i];
        //第 6 步,数组相应位置上的值减1
        array[list[i]]--;
    }

    // 将 output 数组中的数据原封不动地拷贝到 list 数组中
    for (i = 0; i < N; i++) {
        list[i] = output[i];
    }
}

void printlist(int list[]) {
    int i;
    for (i = 0; i < N; ++i) {
        printf("%d ", list[i]);
    }
}

int main() {
    int list[] = {2,5,3,0,3,0,3};
    //进行计数排序
    countingSort(list);
    printlist(list);
}