zoukankan      html  css  js  c++  java
  • 简单谈谈对整形数值交换几种方式理解:

    数值交换是我们经常要用到的知识点,比如在一些经典排序算法中交换两个数的值。

    1、设置中间变量。

    void swap(int a,int b){
    int temp=a;
    a=b;
    b=temp;
    }

    分析:此方式是我们经常用的方式,操作简便,速度比较快,多耗费了一点点空间。

    2、加法。

    void swap(int a,int b){
    a=a+b;
    b=a-b;
    a=a-b;
    }

    分析:此方法省去了第1种方法中开辟的空间,但是运算比较费时间,而且会有越界的问题->可以讲int转换成long、double等类型。

    个人感觉此方法只是一个理论可行方法,平时不会有人这么用的~

    3、异或。

    void swap(int a,int b){
    a^=b;
    b^=a; 
    a^=b;
    }

    异或操作:^是按位异或运算符。将进行异或的两个数转换成2进制,然后:

    ①对应位相同的(同为0或1)结果为0 ;

    ②对应为不同的(有一个为0,另一个为1)结果为1;

    分析:异或操作不会出现越界的问题,但是不同类型的值不能进行异或。还有就是经常看到的关于异或交换的漏洞的问题:

    ①:一个数与其本身异或:a^=a;

    ②:一个数与数值等于其本身的数异或:a=b=3;a=a^b;b=b^a;a=a^b;

    对以上两种情况,以下是我个人的总结以及理解:

    a与其本身异或,会导致a=0;

    而a异或b,a与b虽然都是指向同一个数值,但是a与b本身的栈内存不相同,所以a^b可以完成数据交换。

    总结:对于以上的三种方式,本人建议第一种,容易理解,又不会出错。至于在效率上的问题,在平时接触的比较简单交换中,方法1也是最快的。

    后来我又做了一些交换多次的情况,发现还是方法1比较快。

    public class test {
        public static void main(String[] args) {
            int a=222,b=333;
            long s = System.currentTimeMillis();
            for(int i=0;i<10000000;i++){
                swap1(a, b);
            }
    
            long e = System.currentTimeMillis();
            System.out.println("a="+a+"   b="+b+"  运行时间是:" + (e - s));
        }
    
        public static void swap1(int a, int b) {
            a^=b;
            b^=a;
            a^=b;
        }
        public static void swap2(int a,int b){
            int temp=a;
            a=b;
            b=temp;
        }
    }
    作者:葬瞳飘血
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    2018 ICPC 徐州网络赛
    2018 CCPC网络赛
    2013 NEERC
    2015 Dhaka
    2018ICPC南京网络赛
    Codeforces Round #505
    Codeforces Round #504 E. Down or Right
    Codeforces Round #504 D. Array Restoration
    2018 Multi-University Training Contest 3
    2018 Multi-University Training Contest 2
  • 原文地址:https://www.cnblogs.com/ZTPX/p/6019167.html
Copyright © 2011-2022 走看看