A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.*;
class KuaiPai
{
        public static void main(String[] args)  
        {
                int[] arr = {5,1,6,4,2,8,9};
                printArray(arr);
                Arrays.sort(arr);
                printArray(arr);
        }
        public static int printArray(int[] arr)
        {
                System.out.print("[");
                for(int x=0;x<arr.length;x++)
                {
                        if(x!=arr.length-1)
                                System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]+"]");
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 曾大鹏 于 2013-5-21 15:14 编辑

  int[] arr = {5,1,6,4,2,8,9}; //有这样写的吗。。
C里也不是这样写的
C的写法: int arr[]={5,1,6,4,2,8,9};

int[] arr = {5,1,6,4,2,8,9};  
  你这句话 改一下
  int [] arr=new int[]{5,1,6,4,2,8,9};

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
没看明白Arrays.sort(arr);??什么意思 数组? 记得好像没这么用的 集合? 好像前面又缺点东西而且sort好像是集合用的,集合排序是很快但你要先把数组转成集合才可以
回复 使用道具 举报
根据你的代码来看
printArray()这方法应该没有返回值的
所以,应该把int 改为void
回复 使用道具 举报
不好意思 丢脸了 我一直以为sort排序只有集合才可以用没想到数组也可以这样直接用 谢谢
回复 使用道具 举报
我直接分开回答:
先回答第二个问题:
public static int printArray(int[] arr){  /这个方法的返回值类型是int型的,你不需要返回具体的返回值。改为                               void
。。。。
}
回复 使用道具 举报
再回到第一个问题。这个排序方法不是最快的:只是使用了工具类。对于你写代码的时候更方便了

更快的是希尔算法

  1. /**希尔排序是基于插入排序的一种算法,时间复杂度为 O(N*(logN)2)。
  2. *下面的希尔排序要求待排序的数组必须实现Comparable接口
  3. */
  4. public class ShellSort
  5. {
  6.        private int[] increment;
  7.        /**
  8.        *利用希尔排序算法对数组obj进行排序
  9.        */
  10.        public void sort(Comparable[] obj)
  11.        {
  12.               if (obj == null)
  13.               {
  14.                      throw new NullPointerException("The argument can not be null!");
  15.               }

  16.               //初始化步长
  17.               initGap(obj);

  18.               //步长依次变化(递减)
  19.               for (int i = increment.length - 1 ;i >= 0 ;i-- )
  20.               {
  21.                      int step = increment;                    
  22.                      //由步长位置开始

  23.                      for (int j = step ;j < obj.length ;j++ )
  24.                      {
  25.                             Comparable tmp;

  26.                             //如果后面的小于前面的(相隔step),则与前面的交换
  27.                             for (int m = j ;m >= step ;m = m - step )
  28.                             {
  29.                                    if (obj[m].compareTo(obj[m - step]) < 0)
  30.                                    {
  31.                                           tmp = obj[m - step];
  32.                                           obj[m - step] = obj[m];
  33.                                           obj[m] = tmp;
  34.                                    }
  35.                                    //因为之前的位置必定已经比较过,所以这里直接退出循环
  36.                                    else
  37.                                    {
  38.                                           break;
  39.                                    }
  40.                             }
  41.                      }
  42.               }
  43.        }


  44.        /**
  45.        *根据数组的长度确定求增量的公式的最大指数,公式为pow(4, i) - 3 * pow(2, i)
  46. + 1和9 * pow(4, i) - 9 * pow(2, i) + 1
  47.        *@return int[] 两个公式的最大指数
  48.        *@param length 数组的长度
  49.        */
  50.        private int[] initExponent(int length)
  51.        {
  52.               int[] exp = new int[2];
  53.               exp[0] = 1;
  54.               exp[1] = -1;
  55.               int[] gap = new int[2];
  56.               gap[0] = gap[1] = 0;

  57.               //确定两个公式的最大指数
  58.               while (gap[0] < length)
  59.               {
  60.                      exp[0]++;
  61.                      gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);                     
  62.               }
  63.               exp[0]--;

  64.               while (gap[1] < length)
  65.               {
  66.                      exp[1]++;
  67.                      gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);                       
  68.               }
  69.               exp[1]--;
  70.               return exp;
  71.        }

  72.        private void initGap(Comparable[] obj)
  73.        {
  74.               //利用公式初始化增量序列
  75.               int exp[] = initExponent(obj.length);
  76.               int[] gap = new int[2];

  77.                increment = new int[exp[0] + exp[1]];              






  78.               //将增量数组由大到小赋值
  79.               for (int i = exp[0] + exp[1] - 1 ;i >= 0 ;i-- )
  80.               {
  81.                      gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);
  82.                      gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);

  83.                      //将大的增量先放入增量数组,这里实际上是一个归并排序
  84.                      //不需要考虑gap[0] == gap[1]的情况,因为不可能出现相等。
  85.                      if (gap[0] > gap[1])
  86.                      {
  87.                             increment = gap[0];
  88.                             exp[0]--;
  89.                      }
  90.                      else
  91.                      {
  92.                             increment = gap[1];
  93.                             exp[1]--;
  94.                      }
  95.               }            
  96.        }
  97. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
谢谢7楼这么详细的讲解,学习啦
回复 使用道具 举报
对于程序员来说,代码写的少就减少了很多时间。所以你选择了这个挺不错的。但是运行的时候还是需要时间去调用util 包中的Arrays类的方法。如果你想要自己写的话你也可以用毕老师交的排序方法。两个典型的排序法。选择排序和冒泡排序。我觉得这两个排序法挺简单的。有需要请看毕老师的第四天视频中有。这里我就不详细解说了。你代码中PrintArray是打印方法。是没有返回值的。所以把int的类型改成void类型就可以了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马