黑马程序员技术交流社区

标题: 自己琢磨学习了一个换位算法给大家分享下 [打印本页]

作者: 情歌°    时间: 2014-6-1 21:51
标题: 自己琢磨学习了一个换位算法给大家分享下
本来一开始是学习那个排序的后来发现了个不用设置中间变量就能将两个数换位置的算法  发出来给大家分享一下代码纯自己打的 可能变量名字 有点丑 将就看把……
// 先定义两个变量
int a=5;
int b=3;


//开始换位置了
a=a+b;
//此时b就等于a的值  a还是两个数的和
b=a-b;
//此时a-b就等于b的值 成功换位置
a=a-b;
学习了这个算法以后我就兴冲冲的去把我之前写的选择排序的代码中间变量交换的地方全都改成这个了
悲剧发生了 我发现我排出来的数据 有很多都是0 但是本身数组里面没有0
我就纳闷了 半天也没弄明白到底为什么 后来我就一步一步的调试代码  终于发现问题了
        int min=0;
        int minIndex=0;
        int temp=0;
        public void xuanze(int[]arr)
        {
                for(int i=0;i<arr.length;i++)
                {
                    min=arr[i];
                        minIndex=i;
                        for(int j=i+1;j<arr.length;j++)
                        {
                                if(min>arr[j])
                                {
                                        minIndex=j;
                                        min=arr[j];
                                }
                        }                                                       
                                arr[i]=arr[i]+arr[minIndex];
                                arr[minIndex]=arr[i]-arr[minIndex];
                                arr[i]=arr[i]-arr[minIndex];                               
                               
                }
        }

这个一段选择排序的算法  明白上面换位算法的朋友 可能说没问题
但是 有一种可能就是 排序第一趟后的比较 若第一个数就是最小值
此时i=minIndex 当这种情况发生的时候就造成了arr[minIndex]和arr[i]的值一样
当这段代码完了  arr[minIndex]和arr[i]将都被清空 排序会出问题
所以改进代码为
                if(i!=minIndex)
                        {
                                //假如i=minIndex这种交换会将两个数据都清空
                                arr[i]=arr[i]+arr[minIndex];
                                arr[minIndex]=arr[i]-arr[minIndex];
                                arr[i]=arr[i]-arr[minIndex];                               
                        }               

只要换位时候比较一下是不是索引相同就行了  
完结 撒花!
可能我这个表达能力不强 说的不好懂 大概就是这个意思啦
也许大家早就知道了 可是我这个是调试半天才发现的 也给大家分享一下吧


作者: Autumn    时间: 2014-6-1 23:14
挺爱钻研的门
作者: 情歌°    时间: 2014-6-1 23:33
Autumn 发表于 2014-6-1 23:14
挺爱钻研的门

恩还好吧 是不是太长了没人看啊
作者: ender    时间: 2014-6-2 00:45
好好  学习了
作者: Autumn    时间: 2014-6-2 09:52
情歌° 发表于 2014-6-1 23:33
恩还好吧 是不是太长了没人看啊

可能吧,我大家都会有惰性的。
作者: 情歌°    时间: 2014-6-2 21:59
xmvper 发表于 2014-6-2 10:35

你这种格式咋发出来的?
作者: 情歌°    时间: 2014-6-2 22:02
xmvper 发表于 2014-6-2 10:35

恩 你这个设置一个中间变量也是可以 但是浪费内存了
作者: More    时间: 2014-6-3 08:28
你是把中间变量省去了 是吧,  但是中间变量在现在的计算机基础上等于没占内存   无所谓啦
作者: 情歌°    时间: 2014-6-3 21:48
More 发表于 2014-6-3 08:28
你是把中间变量省去了 是吧,  但是中间变量在现在的计算机基础上等于没占内存   无所谓啦 ...

恩  学习了 我不知道这个




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