我用C实现了一个,效率比JAVA高了不少,一百万和C和JAVA的对比为 34-68 : 83-87 (毫秒),C的执行情况很不稳定,波动比较大,平均在40+,JAVA则稳定多了,大部分都在84左右。一千万C在330-340之间,加不加-o2没什么区别,JAVA则出现了OutOfMemory,加大Xms和Xmx都无济于事(我可是2G的内存),因此无法比较了。JAVA比C的效率低这是毋庸置疑的(废话),但现在JAVA的速度也不错了,而且很稳定。
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
const int SIZE = 1000000;
long getMax(int nums[])
{
int max = 0;
int i;
for(i = 0; i < SIZE; ++i)
{
if(i > max)
max = i;
}
return max;
}
void show(int nums[])
{
int j, pre = nums[0];
int i;
for(i = 1; i < SIZE; ++i)
{
if(nums[i] == pre)
{
++j;
} else
{
printf("%d*%d/n", pre, j);
pre = nums[i];
j = 0;
}
}
if(j != 0)
printf("%d*%d", nums[i-1], j);
}
void sort(int nums[])
{
int max = getMax(nums) + 1;
int *bag = (int*)malloc(max * sizeof(int));
int i;
for(i = 0; i < max; ++i)
bag[i] = 0;
for(i = 0; i < SIZE; ++i)
{
bag[nums[i]]++;
}
int j;
int p = 0;
for(i = 0; i < max; ++i)
{
for(j = 0; j < bag[i]; ++j)
{
nums[p++] = i;
}
}
}
int main(void)
{
clock_t start, finish;
srand(SIZE);
int *nums = (int*)malloc(SIZE * sizeof(int));
int i;
for(i = 0; i < SIZE; ++i)
{
nums[i] = rand() % SIZE;
}
printf("start/n");
//show(nums);
start = clock();
sort(nums);
finish = clock();
//show(nums);
double d = (finish - start);// / CLOCKS_PER_SEC;
printf("%f", d);
free(nums);
return 0;
}
import java.util.Random;
public class MarquisSort{
private static int[] resultData;
public static void main( String[] args ) {
int MAX = 1000000;
int[] nums = new int[ MAX ];
Random r = new Random( System.currentTimeMillis() );
for( int i = 0; i < MAX; i++ ){
nums[ i ] = r.nextInt( MAX );
}
long begin = System.currentTimeMillis();
/*int[] data = */sort( nums );
long end = System.currentTimeMillis();
System.out.println( ( end - begin ) ); // 以这个时间为标准,越小越好。
}
public static int[] sort( int[] nums ){
int max = getMax(nums)+1;
int[] temp = new int[max];
for(int i:nums){
temp[nums[i]]++; //错误已改正
}
int pos=0;
for (int i=0;i<max;i++){
if (temp[i]>0){
for(int l=0;l<temp[i];l++)
nums[pos++]=i;
}
}
return nums;
}
private static int getMax( int[] data ) {
int max = 0;
for( int i : data ){
if( i > max ){
max = i;
}
}
return max;
}
}