黑马程序员技术交流社区

标题: 高手解释一下 数组排序问题? [打印本页]

作者: 石欣欣    时间: 2011-9-4 01:15
标题: 高手解释一下 数组排序问题?
数组排序问题

简化的代码:
if(arrz[x]>arr[y])
{
int temp=arr[x];
arr[x]=arr[y];      //求高人解释{}内的赋值问题,说清是怎么赋值的
att[y]=temp
}

求高人解释{}内的赋值问题,说清是怎么赋值的

作者: 匿名    时间: 2011-9-4 09:03
数组是一个引用类型,所以arr[x]和arr[y]的内容是在堆中的,但是它的引用是在栈中,temp的内容是在栈中的,数组arry[x]将它的引用给temp保存,arr[y]将它的引用给了arr[x],这时arr[x]的引用指向arr[y]原来的内容,temp又将arr[x]原来的引用给arr[y],这是arr[y]的应用指向arr[x]原来指向的内容,这就完成了赋值交换,其实整个过程中数组在堆中的内容没有改变,只是改变了他们各自的引用指向的地方,引用其实就是指针c中的指针,而整个赋值的过程是在栈中执行的,是引用之间的赋值。
作者: 匿名    时间: 2011-9-4 09:16
由于数组是引用,因此arr[x],arr[y]都是在栈中的,在没有进行排序之前也就是temp还没存在之前。arr[x],arr[y]指向他们在堆中的内容,也就是像如1,2,3,4,5.。。。这些内容。进行排序时声明了temp,使它指向arr[x],这样arr[x],temp共同指向原来arr[x]的内容。然后arr[x]=arr[y];这样arr[x]指向了原来arrz[y]的内容,这样arr[x],arr[y]共同指向原来arrz[y]的内容。接着arr[y]=temp;使得arr[y]指向了temp指向的内容,也就是最开始的时候arr[x]的内容。这样arr[x],arr[y]指向的内容就互换了。
由于temp是局部变量,在排序函数结束以后自动垃圾回收。
作者: 匿名    时间: 2011-9-4 09:34
右边给左边的。。。一开始最好自己画个图
作者: 李叶    时间: 2011-9-4 09:51
为了简单解释起见,楼主先想一想这个问题吧~

如果在现实生活中有两个杯子,一个装着雪碧,一个装着可乐
你如果想要交换这两个杯子中的饮料,那应该怎么办呢?
一个很简单的方式是:先找一个空杯子,然后按照以下步骤去做
1、从装可乐的杯子中,把可乐倒进这个空杯子
2、从装雪碧的杯子中,把雪碧倒进之前装可乐的杯子
3、从之前的空杯子中,把可乐倒进之前装雪碧的杯子
搞定

由于现在是数组的问题,那么你就可以把数组想象成一排杯子
其中每个杯子里面都装着不同高度的水,并且每个杯子上都有一个编号
要求杯子必须按照编号进行摆放,也就是你不能改变杯子的位置
那么,如果你想要交换1号杯子和2号杯子里面的水,那应该怎么办呢?
很简单,还是找一个空杯子(在此暂时忽略掉直接兑水的方式吧~)
1、从1号杯子中,把水倒进空杯子
2、从2号杯子中,把水倒进1号杯子
3、从之前的空杯子中把水倒进2号杯子
搞定

所以,现在就拿LZ给出的这段代码来对比一下吧[code=java]int temp=arr[x];
arr[x]=arr[y];
att[y]=temp [/code]其中:
arr就是一排杯子,temp就是空杯子,x和y都是杯子的编号
第一行:int temp=arr[x],翻译过来就是:从x号杯子中,把水倒进空杯子
第二行:arr[x]=arr[y],翻译过来就是:从y号杯子中,把水倒进x号杯子
第三行:arr[y]=temp,翻译过来就是:从之前的空杯子中,把水倒进y号杯子
搞定

用程序的语言来讲解的话,就是:
第一行:int temp=arr[x],翻译过来就是:将数组中第x个变量的值,存到一个临时变量里面
第二行:arr[x]=arr[y],翻译过来就是:将数组中第y个变量的值取出,并存入数组第x个变量中
第三行:arr[y]=temp,翻译过来就是:将临时变量中的值取出,并存入数组第y个变量中
他们的作用就是,交换数组中两个相邻变量的值
[ 本帖最后由 李叶 于 2011-09-04  09:56 编辑 ]
作者: 匿名    时间: 2011-9-4 20:36
你解释的太棒了   我完全懂了
作者: 匿名    时间: 2011-9-4 20:45
李叶的逻辑思维太强了
作者: 匿名    时间: 2011-9-8 12:39
李叶解释的很不错,其实=是一个赋值运算,就是把右边的值赋给左边,所以每一个=运算结束,左边的值就变成右边的值,但是右边的值不变,用一个简单的例子:
                        int x=3;
          int y=4;
          x=y;
          System.out.println("x="+x+" y="+y);
此时显示的是:x=4 y=4;所以左边每被赋值一次,就得到右边的值。
作者: 匿名    时间: 2011-9-8 13:29
赶不上啊~~我要绑架李叶




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