黑马程序员技术交流社区

标题: 关于数组排序 [打印本页]

作者: 梁清平    时间: 2012-5-13 18:45
标题: 关于数组排序
public class ArraySelectSort
{
        public static void main(String[] args)
        {
                int[] arr = {7,6,4,1,9,13,45,66,3};
                sort(arr);
        }
public static void sort(int[] a)
        {
                for(int i=0;i<a.length;i++)
                {
                        int temp=0;
                        for(int j=i+1;j>a.length;j++)
                        {

                                if(a[i]>a[j])
                                {
                                        temp = a[j];
                                }
                                else
                                {
                                        temp = a[i];
                                }
                        }
                        a[i] = temp;
                }
        }
请问:上面的排序算法有没有错误啊?如果是对的还能不能进一步提高运算效率?该怎么做呢?

作者: 云惟桉    时间: 2012-5-13 20:19
内层循环不是应该 j<a.length么,怎么变成 > 了。
在选择排序的原则上算是效率很好的了,起码交换次数已经优化过。

如果楼主需要再了解更高效率的排序,可以参考一下数据结构或者算法设计的书
里面有介绍到希尔排序、快速排序、归并排序等等
作者: 小鹿叙鹿    时间: 2012-5-13 21:04
答案呢,是错误的。
输出的答案全为0
原因是这样的:在第二个for循环中的循环条件就是错误的for(int j=i+1;j>a.length;j++)
j怎么可能一开始就大于a.length呢?这个错误不应该
其次就是你在循环判断的时候的值也只能是数组中最小的那几位
你看啊:不论怎样,第二个循环都是随着条件循环多次或一次,当a[i]=7>6的时候,temp=7,还会继续循环比较,当arr[0]=7<9的时候,temp=9,
从此可以看出,无论怎样比较最后要看的也就是它与最后一位的比较即可,第一轮比较的最后结果时a[0]=7>3,肯定不大于,所以temp=3,当内循环结束
的时候,arr[i]=3.................
至于剩下的循环,于第一轮的分析是一样的,所以出现的就只能是最小的那几个
最重要的一点是:你没有交换位置,你只是把值给赋给你希望的角标了,但是那个要交换的值还是在原来的位置上。

效率肯定是没有的,一般像这些排序,最好的是早写好的对象,这样效率会高,因为它们是跟系统融合的,而我们写的就跟系统的融合就不是那么的密切了。
但是当做练习的时候,还是可取的。

作者: 冯建鹏    时间: 2012-5-13 22:07
刚看到这题的时候看到第二个循环里面”>“  最起码应该改为”<“,后来感觉应该没什么问题,运行结果出乎我的意料,经过仔细思考发现for(int j=i+1;j>a.length;j++)
                         {

                                if(a[i]>a[j])
                                 {
                                         temp = a[j];
                                 }
                                 else
                                 {
                                         temp = a[i];
                                 }
                         }
                         a[i] = temp;
这些代码执行完之后,并没有交换数组角标所对应的值,而是将最小的值赋值给a[i]坐标。。

public class SortDemo
{
        public static void main(String[] args)

     {
                int[] arr = {7,6,4,1,9,13,45,66,3};
                sort(arr);
               System.out.println(Arrays.toString(arr));
     }
public static void sort(int[] a)
        {
                for(int i=0;i<a.length-1;i++)
                {
                       
                        for(int j=i+1;j<a.length;j++)
                        {

                               if(a[i]>a[j])
                               {
                                       int temp=a[i];
                                       a[i]=a[j];
                                       a[j]=temp;
                               }
                              
                }
        }
}
}这样才靠谱 呵呵 这也是老师的代码。。。
作者: 逄焕玮    时间: 2012-5-14 00:33
j>a.length 应该是笔误吧

if(a[i]>a[j])
  {
    temp = a[j];
  }
else
  {
    temp = a[i];
  }
}
a[i] = temp;

这一段开始看的时候确实有些别扭啊,仔细看了下,还确实是不对
如果a[i] > a[j],a[j]的值赋给temp,然后temp值赋给a[i],a[j]的值并未改变,只是a[i]的值变成了小值a[j],然后a[i]和a[j]中存储的都是小值a[j]了。。。
这样的话template定义了也没什么意义了
还是
temp = a[i];
a[i] = a[j];
a[j] = temp;
简单易用啊

或者还可以对角标进行交换
temp = i ;
i = j ;
j = temp;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2