排序算法的最快实现 JAVA and C

我用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;

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值