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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 136616244 中级黑马   /  2014-4-23 09:33  /  2408 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 136616244 于 2014-4-23 09:50 编辑

为什么调用的swap的功能没有用?直接将swap里面的语句写在if里面就OK?

捕获.PNG (147.03 KB, 下载次数: 31)

捕获.PNG

点评

如果你只需要找到最大值的话,可以用这个简单的方法 List list=Arrays.asList(3,5,6,89,6,23,546,2,231,5,6,1,561,21,54); System.out.println(”max=“+Collections.max(list));  发表于 2014-4-24 04:04

21 个回复

正序浏览
首先楼主的参数就传递不规范。居然有没有用到的参数。
其次,在交换的函数swap(int a,int b)其中ab都是传的数组相邻脚标的值进去,而数组作为引用类型调用,本身根本没有置换到,所以输出的还是原来的
回复 使用道具 举报
因为swap方法中的int a 和 int b都是基本类型,是值传递,是重新复制了两个int,不会改变之前的数据,所以在这里没有置换成功。直接放在if中就可以。
回复 使用道具 举报
冒泡算法你知道吗  我感觉你复习一下比较好  多看看笔记
回复 使用道具 举报
陈云阳 发表于 2014-4-23 16:06
public static void swap(int[] arr,int a,int b)
  {               int temp = arr[a];        arr[a] = ...

你QQ多少?


点评

1017105302  发表于 2014-4-23 19:50
回复 使用道具 举报
这个应该是值传递问题,java中只有值传递.没有引用传递,所以你只是调换这两个值(没什么意思),而原本数组中的值根本没有交换.不知道说的对不对. 这里你如果要交换值,只能在for循环中进行,但是这样你就是排序了 等于把最大值排到arr[0],多此一举,直接定义一个中间变量max来存储最大值就ok    我也是小菜一枚 不知道对不对. java中很多很基础但是很不容易搞懂的地方,建议你还是问下老师 才能彻底弄懂里面的原理
回复 使用道具 举报
数组中位置置换的方法应该是这样的,你换的是元素,不能把角标给换了,.注意元素和角标的差别
另外应该先把数组传入进来
public static void swap(int[] arr,int a,int b) {
                int temp = arr[a];
                arr[a] = arr[b];
                arr[b] = temp;
        }
回复 使用道具 举报
  1. public class Max {
  2.        
  3.         public static void main(String[] args) {
  4.                 int[] a = new int[] {1,5,2,31,4,45,346,4,53,8,3,8,23};
  5.                 System.out.println(swapMax(a));
  6.         }
  7.        
  8.         public static int swapMax(int[] array){
  9.                 int max = 0 ;
  10.                 for (int i = 1; i < array.length; i++) if(array[max]<array[i]) max = i ;
  11.                 return array[max];
  12.         }

  13. }
复制代码
回复 使用道具 举报
本帖最后由 陈云阳 于 2014-4-23 19:52 编辑

public static void swap(int[] arr,int a,int b)
  {               int temp = arr[a];        arr[a] = arr;        arr = temp;  
  }
先说说数组的创建


int[] arr = new int[3]; //这个语句是在栈中创建一个arr的数组类型变量,然后在堆中创建三个连续的int类型的的空间,将起始地                       址赋予arr,  arr就指向堆中的数组空间,根据角标来操作数组空间里的元素。

分析下我的swap跟你的swap区别


楼主的swap函数只是在栈中创建一个arr数组变量,跟俩个变量,然后将数组元素传递给这俩个变量,所以在swap内交换的仅仅只是a,b俩个变量,   举个例子,
int a=1,b=2,c,e,t;

c =a;
e = b;
然后 交换变量

t = c;c= e;e = t;
这个c  e交换的仅仅是自己,  a跟b没有变化不是吗,跟楼主的swap函数交换功能同理嘛
而我这个swap函数,
也是在栈中创建一个arr数组变量接收在堆中的数组空间起始地址,跟俩个a b   int型变量接收数组角标,是可以直接操作堆中的数组元素的,才能达到真正的交换










评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报 1 0
本帖最后由 ily521125 于 2014-4-23 13:02 编辑

源码可以放在代码块里,要注释清晰明了,便于阅读

无标题.png (75.53 KB, 下载次数: 28)

无标题.png

点评

版主给我加分分,连楼主都叫我拿扣扣了  发表于 2014-4-23 19:49
回复 使用道具 举报
松毛 发表于 2014-4-23 12:44
获取最大值不需要用到交换位置啊!排序会用到交换位置,交换位置的方法你可以参考着看一下! ...

问题是没交换成功啊
回复 使用道具 举报
松毛 高级黑马 2014-4-23 12:44:04
9#
136616244 发表于 2014-4-23 10:30
你这个OK没问题,我只是想找出我到底哪里理解错了,老毕的源代码我有!

获取最大值不需要用到交换位置啊!排序会用到交换位置,交换位置的方法你可以参考着看一下!
回复 使用道具 举报
\(^o^)/ 发表于 2014-4-23 10:03
楼主下次能不能把代码复制过来,首先你要求最大值的话干嘛用到换位啊,直接定义一个max=0,然后用其他角标 ...

我能问问怎么发代码才可以复制吗?,以前玩游戏上的论坛,只会截图
回复 使用道具 举报
本帖最后由 136616244 于 2014-4-23 10:32 编辑
松毛 发表于 2014-4-23 10:20
你这个里面不要调换顺序的! 以下代码可以参考一下:


你这个OK没问题,我只是想找出我到底哪里理解错了,老毕的源代码我有!
回复 使用道具 举报
唐宋元明清 发表于 2014-4-23 09:52
先说第一个问题,为什么没置换成功? 答:因为你交换的是两个数值,你没指定是哪个数组,所以数组里面的元 ...

我只想将最大数置换到arr[0]的位置,开始我是忘记传数组的引用了,后来我不是传到swap()里面了吗?
回复 使用道具 举报
本帖最后由 松毛 于 2014-4-23 10:27 编辑

你这个里面不要调换顺序的! 以下代码可以参考一下:
  1. class Test01
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr = {5,2,32,28,15,21,36};

  6.                 int max = getMax(arr);
  7.                 System.out.println("max = " + max);
  8.                
  9.                 sort(arr);

  10.                 printArray(arr);

  11.                
  12.         }

  13.         //排序;
  14.         public static void sort(int[] arr)
  15.         {
  16.                 for(int i=0; i<arr.length-1; i++)
  17.                 {
  18.                         for(int j=i; j<arr.length; j++)
  19.                         {
  20.                                 if(arr[i] > arr[j])
  21.                                 {
  22.                                         swap(arr,i,j);
  23.                                 }
  24.                         }
  25.                 }
  26.         }

  27.         //调换数组角标位置;
  28.         public static void swap(int[] arr, int i, int j)
  29.         {
  30.                 int temp = arr[i];
  31.                 arr[i] = arr[j];
  32.                 arr[j] = temp;
  33.         }

  34.         //打印数组;
  35.         public static void printArray(int[] arr)
  36.         {
  37.                 for( int i=0; i<arr.length; i++)
  38.                 {
  39.                         System.out.print(arr[i] + " ");
  40.                 }
  41.         }

  42.         //获取数组中最大元素;
  43.         public static int getMax(int[] arr)
  44.         {
  45.                 int max = 0;
  46.                 for(int i=0; i<arr.length; i++)
  47.                 {
  48.                         if(arr[max]<arr[i])
  49.                                 max = i;
  50.                 }
  51.                 return arr[max];
  52.         }
  53. }
复制代码





评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
  1. class  SwapTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr = {3,5,2,6,8,1};
  6.                
  7.                 System.out.println(getMax(arr));
  8.         }
  9.         public static int getMax(int[] arr)
  10.         {
  11.                 int max = 0;
  12.                 for (int x = 1; x < arr.length ; x++ )
  13.                 {
  14.                         if(arr[max] < arr[x])
  15.                                 arr[max] = arr[x];//求最值不用换位置哇,直接赋值给临时变量就可以。
  16.                 }
  17.                 return arr[max];
  18.         }
  19.        
  20. }
复制代码
回复 使用道具 举报
楼主下次能不能把代码复制过来,首先你要求最大值的话干嘛用到换位啊,直接定义一个max=0,然后用其他角标和他比较,大于max的话就用max记录下来不就可以了。。。。
回复 使用道具 举报
先说第一个问题,为什么没置换成功? 答:因为你交换的是两个数值,你没指定是哪个数组,所以数组里面的元素没有交换;      第二,求最大数。求最大数,只用一个变量max记住这个数值或者记住这个数值在数组中的位置就行,没必要按你以上方法去把整个数组重新排序。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马