黑马程序员技术交流社区

标题: 数组选择排序问题 [打印本页]

作者: 贠(yun)靖    时间: 2012-3-10 19:34
标题: 数组选择排序问题
public void selectSort(int[] arr)  
{
     for (int x=0;x<arr.length-1 ;x++ )
     {
           for (int y=x;y+1<arr.length ;y++ ) //这样写会排不完 有少排了一次循环   
        {                          //而我改成 for(y=x+1;y<arr.length;y++)  就能排序
                    if (arr[y]>arr[y+1])             //谁能帮我解答一下  我感觉这两种写法都一样啊
               {                           // 到底哪里出问题了?
                swap(arr,y,y+1);
               }
        }
     }
        prinSort(arr);   //输出方法
}
作者: 王睿    时间: 2012-3-10 19:52
y+1<arr.length   其实就是y<arr.length-1

你改成y+1<=arr.length应该就可以了
作者: 倪鹏博    时间: 2012-3-10 19:52
这是冒泡排序和选择排序的杂交体啊!
选择排序的话,为什么要换arr[y]和arr[y+1]呢?换arr[x]和arr[y]才对吧!
public static void selectSort(int[] arr)
        {
                for(int x=0;x<arr.length-1;x++)
                {
                        for(int y=x+1;y<arr.length;y++)
                        {
                                if(arr[x]>arr[y])
                                {
                                        swap(arr,x,y);
                                }
                        }
                }
        }
作者: 贠(yun)靖    时间: 2012-3-10 19:59
王睿 发表于 2012-3-10 19:52
y+1

不行 会数组越界的~~~
作者: 贠(yun)靖    时间: 2012-3-10 19:59
倪鹏博 发表于 2012-3-10 19:52
这是冒泡排序和选择排序的杂交体啊!
选择排序的话,为什么要换arr[y]和arr[y+1]呢?换arr[x]和arr[y]才对 ...

我只是想换一种写法   for写的不同  交换就写的不同啊~~!
作者: 倪鹏博    时间: 2012-3-10 20:11
本帖最后由 倪鹏博 于 2012-3-10 20:19 编辑
贠(yun)靖 发表于 2012-3-10 19:59
我只是想换一种写法   for写的不同  交换就写的不同啊~~!


你的写法是错误的,两种写法都不会出结果的!
冒泡排序和选择排序的思想是不一样的,所以不能混合使用!
按照你的程序:
for(y=x+1;y<arr.length;y++)  的时候,首先下标会越界!其次,这情况下你的arr[0]没有参与排序!所以结果肯定是不对的!
for(y=x;y+1<arr.length;y++)  的时候,x=y=0第一次执行的时候,是arr[0]和arr[1]中的最小值在前。。。。。。
                                                               x=y=1的时候,是arr[1]和arr[2]取最小值
也就是说,arr[0]只参与了一次比较,你把arr[0]和arr[1]的最小值当成了整个数组的最小值,这显然是不对的!结果不可能正确!
作者: 冯旭君    时间: 2012-3-10 20:20
 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
  ①初始状态:无序区为R[1..n],有序区为空。
  ②第1趟排序
  在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
  ……
  ③第i趟排序
  第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
  这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
  
作者: 黄方    时间: 2012-3-10 20:34
本帖最后由 黄方 于 2012-3-10 20:45 编辑

!!!!!!!!!!!!!!!

QQ截图20120310202846.png (21.79 KB, 下载次数: 110)

QQ截图20120310202846.png

QQ截图20120310203553.png (18.2 KB, 下载次数: 111)

QQ截图20120310203553.png

QQ截图20120310203553.png (18.2 KB, 下载次数: 108)

QQ截图20120310203553.png

QQ截图20120310203612.png (15.77 KB, 下载次数: 114)

QQ截图20120310203612.png

2.png (18.2 KB, 下载次数: 108)

2.png

3.png (15.77 KB, 下载次数: 117)

3.png

作者: 刘蕴学    时间: 2012-3-10 23:06
本帖最后由 了无尘 于 2012-3-10 23:07 编辑

你这个定义个2维数组来看看xy的对比表好理解点
作者: 黑马张平    时间: 2012-3-11 15:06
上面的图片看不清啊。





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