黑马程序员技术交流社区

标题: 冒泡排序、选择排序 大家看看还有什么能改进的地方 [打印本页]

作者: 付江涛    时间: 2014-1-25 12:16
标题: 冒泡排序、选择排序 大家看看还有什么能改进的地方
本帖最后由 付江涛 于 2014-1-26 15:41 编辑
  1. /*
  2. 练习:
  3. {5,95,45,1,2,8,36,44,15,98,774,11,32}
  4. 使用选择排序和冒泡排序方法对数组进行排序
  5. */
  6. class  array
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 int[] arr=new int[]{5,95,45,1,2,8,36,44,15,98,774,11,32};

  11.                 print(arr); //打印数组
  12. //                Select(arr); //调用函数进行选择排序
  13.                 bubble(arr);  //进行冒泡排序
  14.                 print(arr);//打印选择排序后的结果
  15.                
  16.         }

  17.         //选择排序
  18.         public static void Select(int[] arr)
  19.         {
  20.                 for (int x=0;x<arr.length-1 ;x++ )   // 是不是也可以不用-1?
  21.                 {
  22.                         for (int y=x+1;y<arr.length ;y++ )
  23.                         {
  24.                                 if (arr[x]>arr[y])
  25.                                 {
  26.                                         int i=arr[x];
  27.                                         arr[x]=arr[y];
  28.                                         arr[y]=i;
  29.                                 }
  30.                         }
  31.                 }
  32.         }

  33.         //冒泡排序
  34.         public static void bubble(int[] arr)
  35.         {
  36.                 for (int x=0;x<arr.length-1 ;x++ )
  37.                 {
  38.                         for (int y=0;y<arr.length-x-1 ;y++ )  //-x 让每一次比较的元素减少,  -1 避免角标越界
  39.                         {
  40.                                 if (arr[y]>arr[y+1])
  41.                                 {
  42.                                         int i=arr[y];
  43.                                         arr[y]=arr[y+1];
  44.                                         arr[y+1]=i;
  45.                                 }
  46.                         }
  47.                 }
  48.         }
  49.         
  50.         //打印数组
  51.         public static void print(int[] arr)
  52.         {
  53.                 System.out.print("[");
  54.                 for (int x=0;x<arr.length ;x++ )
  55.                 {
  56.                         
  57.                         if (arr[x]!=arr[arr.length-1])
  58.                         {
  59.                                 System.out.print(arr[x]+",");
  60.                         }
  61.                         else
  62.                                 System.out.println(arr[x]+"]");
  63.                 }
  64.                                 System.out.println();
  65.         }
  66. }
复制代码



昨天还不太明白,今天思路就变得清晰了。自己按着老师的思路走了一下写出来了。



大家看看还有什么错误或者还能改进的地方


作者: 付江涛    时间: 2014-1-25 12:57
{:soso__14430788048038969402_4:}
作者: zhangchao    时间: 2014-1-25 12:59
       //选择排序
        public static void Select(int[] arr)
        {
                for (int x=0;x<arr.length-1 ;x++ )   // 是不是也可以不用-1?
                                                                                                        //<-----注释:
                {                                                                        //可以不用-1,-1是为了提高执行效率,原因是:
                                                                                                        //x = arr.length-1时对应的arr[x]已经是数组中最后一个元素了,此时就没有比较的必要了
                                                                                                        //------->
                        for (int y=x+1;y<arr.length ;y++ )
                        {
                                if (arr[x]>arr[y])
                                {
                                        int i=arr[x];
                                        arr[x]=arr[y];
                                        arr[y]=i;
                                }
                        }
                }
        }

                /*
                优化后的选择排序
                减少数据的交换次数,实现效率的提升
                */
                public static void selectorSort(int[] arr)
                {
                        for(int x = 0; x < arr.length-1; x++)
                        {
                                int tempIndex = x;

                                for(int y = x+1; y < arr.length; y++)
                                {
                                        if (arr[tempIndex]>arr[y])
                    {
                                                tempIndex = y;
                    }
                                }
                                if(tempIndex != x)
                                {
                                                //可以将其封装为函数
                    int temp =arr[x];
                    arr[x]=arr[tempIndex];
                    arr[tempIndex]=temp;
                                }
                        }
                }

        //冒泡排序
                /*
                楼主有兴趣可以自己实现
                思路:
                        通过减少数据交换次数,实现效率提升
                步骤:
                        1. 定义一个数组,用来存放排好序的元素的角标
                        2. 内循环完成一次后将最大(最小)的元素对应的角标存放到数组中;
                        3. 最后遍历角标数组,该角标数组中存放的是原数组中的角标值。
                */
        public static void bubble(int[] arr)
        {
                for (int x=0;x<arr.length-1 ;x++ )
                {
                        for (int y=0;y<arr.length-x-1 ;y++ )  //-x 让每一次比较的元素减少,  -1 避免角标越界
                        {
                                if (arr[y]>arr[y+1])
                                {
                                        int i=arr[y];
                                        arr[y]=arr[y+1];
                                        arr[y+1]=i;
                                }
                        }
                }
        }
有不对之处,请指正


作者: 付江涛    时间: 2014-1-25 13:08
zhangchao 发表于 2014-1-25 12:59
//选择排序
        public static void Select(int[] arr)
        {

{:3_64:}多谢纠正~
作者: IT人    时间: 2014-1-25 13:45
不用减1也行,程序不会出现错误,但是外层循环会多一次判断,效率低一点。
作者: 付江涛    时间: 2014-1-25 13:50
IT人 发表于 2014-1-25 13:45
不用减1也行,程序不会出现错误,但是外层循环会多一次判断,效率低一点。 ...

{:soso__2975127348007296759_3:}

作者: 翼展哈哈    时间: 2014-1-25 15:48
zhangchao 发表于 2014-1-25 12:59
//选择排序
        public static void Select(int[] arr)
        {

学习了,谢谢
作者: zhangchao    时间: 2014-1-25 19:11
客气了,互相学习,共同进步
作者: 悟中生有    时间: 2014-1-26 15:38
不错!思路挺清晰的,
作者: 周昭民    时间: 2014-1-26 16:25
                                if (arr[y]>arr[y+1])
                                {
                                        int i=arr[y];
                                        arr[y]=arr[y+1];
                                        arr[y+1]=i;
                                }
可以将此处用于替换的代码块封装成一个私有方法来使用




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