首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【竞赛】排序算法的最快实现 [已结贴,结贴人:java2000_net]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:14:12 楼主
    规则如下:
    1 数据量为10万(好的算法可以到100万),从小到大排序
    2 数据采用如下代码产生,保证测试数据的唯一性
    3 不限制内存的使用
    4 最后将在不同用户的同一台机器上进行多次测试,以运行时间为标准,越少越好。
    5 如果速度太快,就使用 System.nanoTime(); 进行判断或者加大数据量到100万,甚至1000万数量级进行判断。
    6 评委暂定为java版的几位小版主

    参加方法
    1 直接把代码回复在后面即可
    2 截至日期为本周5的晚上
    3 奖励前5名,第一名400技术专家分,第二名200技术专家分,3、4、5名每人100技术专家分。
    4 前2名,允许个人介绍,求职,个人作品宣传的帖子大版置顶3天。

    初始化代码如下。
    Java code
    import java.util.Random; class T { 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(); sort(nums); long end = System.currentTimeMillis(); System.out.println((end - begin)); // 以这个时间为标准,越小越好。 } public static int[] sort(int[] nums) { // 您的排序代码放在这里啦 return nums; } }
    300  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:14:161楼 得分:0
    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【java2000_net】截止到2008-06-23 14:14:03的历史汇总数据(不包括此帖):
    发帖数:162                发帖分:17891             
    结贴数:159                结贴分:17271             
    未结数:3                  未结分:620               
    结贴率:98.15 %            结分率:96.53 %           
    值得尊敬
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:19:302楼 得分:0
    从小到大排序
    从小到大排序
    从小到大排序
    从小到大排序
    从小到大排序
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:20:373楼 得分:0
    mark 学习
    回复内容太短了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:23:504楼 得分:0
    我先提供一个
    Java code
    public static int[] sort(int[] nums) { int size = nums.length; int tmp; for (int i = 0; i < size; i++) { for (int j = i; j < size; j++) { if (nums[i] > nums[j]) { tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } } } return nums; }


    在我的机器上运行时间: 32281
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:30:515楼 得分:0
    mark

    关注此贴
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:32:116楼 得分:0
    就那几个经典的排序算法吧,一个个试试哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:37:347楼 得分:0

    Arrays.sort(nums);

    为什么不用这个呢,跑了下,好像挺快的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:42:168楼 得分:0
    顶下~~!学习中。。。。
    支持紫竹老大
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Edidu
    • 等级:
    发表于:2008-06-23 14:44:429楼 得分:0
    楼主使用冒泡抛砖引玉,用心良苦啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • B_Lee
    • 等级:
    发表于:2008-06-23 14:49:4510楼 得分:0
    Java code
    public static int[] directInsertSort(int[] nums) { // 已经排序的长度 int leng = 1; // 标记 int mark; for (int i = 1; i < nums.length; i++) { mark = nums[leng];// 将未排序列的第一个元素暂存 if (nums[i] < nums[i - 1]) {// leng处小于已排序部分的最大数,需要插入 for (int j = 0; j < leng; j++) {// 将mark插入已排序部分的适当位置 if (mark <= nums[j]) {// mark不大于nums[j] for (int k = leng - 1; k >= j; k--) {// 移动 nums[k + 1] = nums[k]; } nums[j] = mark; break;// 跳出 } } } leng++;// 已排序部分的长度加1 }// for return nums; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:53:2411楼 得分:0
    ……为什么第一个念头是去看Arrays.sort的源码
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:53:5212楼 得分:0
    用归并排序吧,不过俺不会Java...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:54:5013楼 得分:0
    Java code
    public static int[] sort(int[] nums) { Arrays.sort(nums); return nums; }

    //不知道用JDK的工具可不可以,这个是用快速排序算法实现的,应该是最快的.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Edidu
    • 等级:
    发表于:2008-06-23 14:56:0014楼 得分:0
    不会java
    只会vbs,凑凑热闹哈

    VBScript code
    Function QSort(nums) Dim L, R, tmp L = 1 R = ubound(nums) 'Get the arrays length tmp = nums(L) Do Until L >= R While (Data(R) > tmp And R > L) R = R - 1 Wend If R > L Then Data(L) = Data(R) Data(R) = tmp L = L + 1 End If While (Data(L) < tmp And R > L) L = L + 1 Wend If R > L Then Data(R) = Data(L) Data(L) = tmp R = R - 1 End If Loop QSort = nums End Function
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangkai08111
    • 等级:
    发表于:2008-06-23 14:56:1015楼 得分:0
    好像著名的有九种。
    1.插入排序
    2. 冒泡排序
    3选择排序
    四 Shell排序
    五 快速排序-----一般分如下步骤:
    1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)
    2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。
    3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
    快速排序的核心在于分割算法,也可以说是最有技巧的部分。
    6.归并排序
    7堆排序
    8.桶式排序
    9.基数排序
    基数排很多的元素,效率不错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:57:1416楼 得分:0
    居然又有人用Sort来说呢,再无语一次!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:59:1717楼 得分:0
    此贴有意义,有价值,坚决支持!!!
    关注此贴动态。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darluc
    • 等级:
    发表于:2008-06-23 14:59:2718楼 得分:0
    个人认为排序完成后,再调整一下系统时间就更快了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • interpb
    • 等级:
    发表于:2008-06-23 14:59:5319楼 得分:0
    有个建议:

    只靠随机生成一个数列用来排序的话,可能会有一点不公平

    因为大家知道,不同的算法有不同的优点

    比如:

    如果数列本身有序,用冒泡的 只需要一趟检查就可以搞定,而用快速排序就需要log(n) 趟

      所以最好综合考虑一下 用不同性质的数列去测试这个算法 综合评估这样会更公平一点


         


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 14:59:5320楼 得分:50
    如果是整数,那么计数排序法是最快的

    时间是o(n)

    Java code
    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( int[] nums ) { // 您的排序代码放在这里啦 resultData = new int[nums.length]; countingSort( nums, resultData, getMaxInt( nums ) ); return resultData; } private static int getMaxInt( int[] data ) { int max = 0; for( int i : data ) { if( i > max ) { max = i; } } return max; } private static void countingSort( int[] oriData, int[] resultData, int k ) { int[] assistData = new int[ k + 1 ]; for( int i = 0; i < assistData.length ; i++ ) { assistData[ i ] = 0; } for( int j = 0; j < oriData.length ; j++ ) { assistData[ oriData[ j ] ] = assistData[ oriData[ j ] ] + 1; } for( int i = 1; i < assistData.length ; i++ ) { assistData[ i ] = assistData[ i ] + assistData[ i - 1 ]; } for( int j = oriData.length - 1 ; j >= 0 ; j-- ) { resultData[ assistData[ oriData[ j ] ] - 1 ] = oriData[ j ]; assistData[ oriData[ j ] ] = assistData[ oriData[ j ] ] - 1; } } }


    在我的电脑上运行时间是: 16
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darluc
    • 等级:
    发表于:2008-06-23 15:01:0421楼 得分:0
    static int doPartition(int key,int left,int right){
    int leftScan = left - 1;
    int rightScan = right + 1;
    int count = 0;
    while(true){
    while((++count) > 0&&leftScan < right&&arrNums[++leftScan] < key)
    ;
    while((++count) > 0&&rightScan > left&&arrNums[--rightScan] > key)
    ;
    if(leftScan > rightScan){
    break;
    }
    else{
    swap(leftScan,rightScan);
    }
    }
    //System.out.println(count);
    return rightScan;
    }
    /**
    * 快速排序
    * @param key
    * @param left
    * @param right
    */
    static void quickSort(int key,int left,int right){
    //int i;
    if(left  >= right)
    return;
    i = doPartition(key,left,right);
    quickSort(arrNums[(left + i) / 2],left,i );
    quickSort(arrNums[(i + right) / 2],i + 1,right);
    }
    注:copy来的代码
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JerryBeckF
    • 等级:
    发表于:2008-06-23 15:01:5122楼 得分:0
    引用 18 楼 darluc 的回复:
    个人认为排序完成后,再调整一下系统时间就更快了

    汗...sort不算吧..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • B_Lee
    • 等级:
    发表于:2008-06-23 15:02:1623楼 得分:0
    Java code
    /** * 快速排序法 * * @param array * @param star * 将要进行快速排序的第一个元素位置(下标) * @param end * 将要进行快速排序的最后一个元素位置(下标) */ public static void quickSort(int[] array, int star, int end) { // 记录原来的位置 int priStar = star; int priEnd = end; if (star == end) {// 只有一个元素 return; } else { int key = array[star]; // 以第一个元素作为关键数据 int tem = 0; // 交换数据时用所的中间变量 while (star < end) { while (star < end && array[end] >= key) {// 从最后一个元素开始找第一个比key小的元素 end--; } if (star != end) {// 两都不等,说明找到,交换 tem = array[star]; array[star] = array[end]; array[end] = tem; } while (star < end && array[star] <= key) {// 从第一个元素开始找第一个比key大的元素 star++; } if (star != end) {// 两都不等,说明找到,交换 tem = array[star]; array[star] = array[end]; array[end] = tem; } }// while if (priStar < star - 1) { // 如果关键值不是处于第一位,则对关键值前一部分进行递归排序 quickSort(array, priStar, star - 1); } if (priEnd > end + 1) { // 如果关键值不是牌最后一位,则对关键值后面的部分进行递归排序 quickSort(array, end + 1, priEnd); } } }


    以前写的,不符题目要求,但真的很快,在我的电脑上运行没有超过三位数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • joneyonly
    • 等级:
    发表于:2008-06-23 15:08:1624楼 得分:0
    引用 19 楼 interpb 的回复:
    有个建议:

    只靠随机生成一个数列用来排序的话,可能会有一点不公平

    因为大家知道,不同的算法有不同的优点

    比如:

    如果数列本身有序,用冒泡的 只需要一趟检查就可以搞定,而用快速排序就需要log(n) 趟

      所以最好综合考虑一下 用不同性质的数列去测试这个算法 综合评估这样会更公平一点


         

    同意这个观点
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-23 15:31:0425楼 得分:0
    public static int[] sort(int[] nums) {
      Arrays.sort(nums);

        return nums;
      }