编辑代码

#include <stdio.h>

//计数排序 (基于比较)
void CountSort(int *arr,int len,int *temp){
	int i,j;
	int count[len];
	for(i = 0;i < len;i++)					//初始化count数组 
		count[i] = 0;
	for(i = 0;i < len-1;i++){				//外层循环,每次选取最前面一个 
		for(j = i+1;j < len;j++){			//内层循环,每次让当前元素和它后面的元素比较 
			if(arr[i] > arr[j]){			//若前一个大于后一个,则让count[i]+1 
				count[i]++;
			}else							 
				count[j]++;
		}
	}										//循环完毕,此时count数组里面的数据应该是对应arr数组中所在位置的最终下标 
	for(i = 0;i < len;i++){					
		temp[count[i]] = arr[i];			//创建临时数组,将count[i]作为arr的下标,存储在temp数组中,此时temp就是排好序的数组 
	}
}

int Max_Num(int *arr,int len){
    int max = 0;
    for(int i = 0;i<len ;i++){
        if(arr[i]>max){
            max = arr[i];
        }
    }
    return max;
}

//计数排序 (不基于比较)
void Count_Sort(int *arr,int len,int *temp,int max){
    int i,j,count[max];
    for(i = 0 ; i<max;i++)
        count[i]=0;
    //统计当前元素的元素个数
    for(i = 0;i < len ;i++){
        count[arr[i]]++;
    }
    //统计小于等于当前元素的个数
    for(i = 1;i<len;i++){
       count[i]+=count[i-1];
    }
    for(j = len-1;j>=0;j--){
        count[arr[j]]--;
        temp[count[arr[j]]] = arr[j];
    }
}

//显示函数 
void display(int *arr,int len){
	for(int i=0;i<len;i++)
		printf("%d ",arr[i]);
}

int main(){
	int arr[] = {9,5,7,10,8};
	int len = sizeof(arr) / sizeof(int);
	int temp[len];
	CountSort(arr,len,temp);
	display(temp,len);
	printf("\n");
    int arr2[]={2,5,3,0,2,3,0,3};
    int len2 = sizeof(arr2) / sizeof(int);
    int temp2[len2];
    int max = Max_Num(arr2,len2);
    Count_Sort(arr2,len2,temp2,max);
    display(temp2,len2);
}