日期:2014-05-20  浏览次数:20685 次

【竞赛】排序算法的最快实现-继续
由于早上帖子不能访问,我只能忍痛结掉了。并根据现有的成绩分配了积分。

澄清一下这个竞赛的目的,是为了大家共同拿到几个排序的好的算法,注意是几个,而不是一个。
在不同的情况下,各个算法的表现是不同的。

新的测试代码可以自行定义测试的次数和随机的种子。 可以对测试结果自动排序。
下面给出新的测试代码框架。

完整代码太长,需要的请到这里获取, 其中包括已经在另一个帖子给出算法的测试。 http://blog.zhaoxq.java2000.net/v16

Java code
package sort;

import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;

/**
 * CSDN 排序竞赛
 * @version 2008-06-24 07:31
 */
class TestSort {
  static int MAX = 1000000; // 最大数据量

  static int[] nums = new int[MAX]; // 特意移到类一级,免得他们需要时没有这个

  static Map<Long, String> map = new TreeMap<Long, String>(); // 排序的结果,纳秒为单位了。

  static long seed = 20080623;

  private static void init() {
    Random r = new Random(seed);
    for (int i = 0; i < MAX; i++) {
      nums[i] = r.nextInt(MAX);
    }
  }

  private static String showResult() { // 这里随便选了几个进行排序结果的测试
    return nums[1] + " " + nums[1234] + " " + nums[23456] + " " + nums[67890] + " " + nums[MAX - 1];
  }

  public static void main(String[] args) {
    Random ran = new Random();
    for (int i = 1; i <= 1; i++) { // 此处定义循环测试的次数
      seed = ran.nextInt(999999999);
      test();
    }
    for (String str : map.values()) {
      System.out.print(str);
    }
  }

  public static void test() {
    long begin;
    long end;
    //
    // 测试代码框架开始
    init();
    begin = System.nanoTime();
    sort_JDK(nums);
    end = System.nanoTime();
    map.put((end - begin), String.format("%20s%15d %s\r\n", "sort_JDK=", (end - begin), showResult()));
    // 测试代码框架结束



    // 其它的测试代码将按照顺序逐个放到后面进行测试。
    // 某些方法没有使用我提供的标准调用,造成我手工修改,引起不必要的问题。
    // 请大家查看我测试的完整代码,并根据你的需求进行完善与修改。

   }
  public static int[] sort_JDK(int[] nums) {
    Arrays.sort(nums);
    return nums;
  }
}



请大家整理好自己的算法帖子,命名方法为
public static int[] sort_${CSDN_USERNAME}(int[] nums) 
比如
public static int[] sort_java2000_net(int[] nums) 
public static int[] sort_talent_marquis(int[] nums) {




------解决方案--------------------

------解决方案--------------------
看高手实现..........
------解决方案--------------------
继续跟贴,记号!!
------解决方案--------------------
关注一下 ...............
------解决方案--------------------
继续关注 ...............
------解决方案--------------------
单纯的数组排序似乎意义不大,
以前也专门研究过一段时间,
发现排序效率和给定的序列初始顺序有很大的关系,
而且对于中小规模序列,效率并没有实质性的提高,
例如十万个数据(对于中小规模的系统),
如果最好的排序算法与最差的算法差了100ms,
其实对于用户来说几乎毫无意义。
我在实际应用中最关心按索引排序,
例如有10000个学生Stru的实例,首先有个学号排序(id,这可以从数据库中通过sort获得),
后来要按照他们年龄或者身高排序,同时要记录原有的学号顺序。

------解决方案--------------------
各种方法都有了,最后一种没见过。
个人感觉可以考虑空间换时间
------解决方案--------------------
支持·
学习·
------解决方案--------------------
改的john_sheep的,恐怕他的很难超越了.
改的好像还没以前的快,数分布的太均匀了.........
Java code

import java.util.Random;

public class MarquisSort
{
    private static int[] resultData;
    
    public static void main( String[] args )
    {

        int MAX = 100000;
        int[] nums = new int[ MAX ];
        Random r = new Random( 20080623 );
        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_vtudiv( int[] nums )
    {
           
        int[] temp = new int[nums.length];
        int max = getMax(temp)+1;
        for(int i:nums)
        {
            temp[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.length;;i--)
        {
            if( 0!=data[i] )
            {
                max = i;
                break;
                
            }
        }
        return max;
    }
}