首先我们需要从我们的标题要求看起,计数排序的意思是计数排序是一个非基于比较的排序算法,它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
排序思路:
- 扫描整个集合,并设置一个临时数组,用来存放集合中的数据作为此数组的集合
- 临时数组设置空间为集合中最大数+1
我们在来思考一个问题,就是说,我们现在使用的是函数调用版本,那么就代表着我要要把排序好之后的数组传回main函数中去。所以使用到了最头疼的指针。再者,就是函数被调用完成之后,系统为函数开辟的临时空间将会被销毁,那么我们就只能定义一个全局变量或者在原来的集合基础上更改他们的值。假如我们定义一个全局变量的数组,那么我们只能定义一个订定长数组,显然特别不方便。所以我们将会采用后者——在原来的集合基础上更改他们的值。
就产生了以下的代码:
#include <iostream>
using namespace std;
int *sum(int a[],int i){
int max=a[0];
for(int j=0;j<i;j++){
if(a[j]>max){
max = a[j];//寻找最大值
}
}
int s[max+1];
for(int j=0;j<max+1;j++){
s[j] = 0;//给数组初始值
}
for(int j=0;j<i;j++){
s[a[j]] ++;
}
int index=0;
int num[i];
for(int j=0;j<i;j++){
num[j] = 0;//给数组初始值
}
for(int j=0;j<max+1;j++){
for(int k=0;k<s[j];k++){
a[index++] = j;
}
}
return a;
}
int main() {
int a[]={1,2,2,6,2,3,8,3};
int *t=sum(a,sizeof(a)/ sizeof(a[0]));//sizeof(a)/ sizeof(a[0])计算数组的长度
for(int i=0;i<8;i++){
cout<<t[i]<<" ";
}
return 0;
}