编辑代码

#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++){
        //创建临时数组,将count[i]作为arr的下标,存储在temp数组中,此时temp就是排好序的数组 				
		temp[count[i]] = arr[i];
	}
}

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]);  
    }  
    printf("\n");  
}  

int main(){
	int arr[] = {9,5,7,10,8};
	int temp[5];
    printf("测试1-计数排序 (基于比较):排序前:");
    display(arr, 5);
	CountSort(arr, 5, temp);
    printf("测试1-计数排序 (基于比较):排序后:");
	display(temp,5);

    int arr2[]={2,5,3,0,2,3,0,3};
    int temp2[8];
    int max = Max_Num(arr2, 8);
    printf("测试2-计数排序 (不基于比较):排序前:");
    display(arr2, 8);
    Count_Sort(arr2, 8, temp2, max);
    printf("测试2-计数排序 (不基于比较):排序后:");
    display(temp2,8);
}