桶排序
publicstaticvoid bucketSort(int[] a,int max){
int[] buckets;
if(a==null || max<1)
return;
buckets =newint[max];
// 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。for(int i =0; i < a.length; i++)
// 1. 计数buckets[a[i]]++;
for(int i =0, j =0; i < max; i++)
// 2. 排序{
while((buckets[i]--)> 0)
a[j++]= i;
}
buckets = null;
}
基数排序
/*
* 获取数组a中最大值
* 参数说明:
a -- 数组 n -- 数组长度*/
int get_max(int a[],int n)
{
int i, max;
max = a[0];
for(i =1; i < n; i++)
if(a[i]> max)
max = a[i];
return max;
}
/*
* 对数组按照"某个位数"进行排序(桶排序)
*
* 参数说明:
* a -- 数组
* n -- 数组长度
* exp -- 指数。对数组a按照该指数进行排序。
*
* 例如,对于数组a={50, 3, 542, 745, 2014, 154, 63, 616};
* (01) 当exp=1表示按照"个位"对数组a进行排序
* (02) 当exp=10表示按照"十位"对数组a进行排序
* (03) 当exp=100表示按照"百位"对数组a进行排序
* ...
*/
void count_sort(int a[],int n,int exp)
{
int output[n]; // 存储"被排序数据"的临时数组
int i, buckets[10]={0};
for(i =0; i < n; i++)
// 将数据出现的次数存储在buckets[]中buckets[(a[i]/exp)%10]++;
for(i =1; i <10; i++)
// 更改buckets[i]。目的是让更改后的buckets[i]的值是该数据在output[]中的位置。buckets[i]+= buckets[i -1];
for(i = n -1; i >=0; i--)
// 将数据存储到临时数组output[]中{
output[buckets[(a[i]/exp)%10]-1]= a[i];
buckets[(a[i]/exp)%10]--;
}
for(i =0; i < n; i++)
// 将排序好的数据赋值给a[]a[i]= output[i];
}
/*
* 基数排序
* 参数说明:
a -- 数组 n -- 数组长度*/
void radix_sort(int a[],int n)
{
int exp; // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...
int max = get_max(a, n); // 数组a中的最大值
for(exp =1; max/exp >0; exp *=10)
// 从个位开始,对数组a按"指数"进行排序count_sort(a, n, exp);
}