java交换两个数的常见方法及效率测试

原文地址——http://blog.csdn.net/qq525099302/article/details/47294443

论两个数的交换的重要性

讨论交换两个数的方法对某些人来说无聊,但某些人很乐意探究,甚至某些面试官喜欢用这个做文章。刚出来找工作笔试的时候我也碰到与之相关的问题。

常见的两个数交换的方法

  • 边赋值边运算
  • 加减减交换
  • 用中间变量交换
  • 异或交换

下面是代码

public class Test {
    public static void main(String[] args) {
        long start,end;
        int a = 100000, b = 200000, t;
        start = System.currentTimeMillis();
        for (int i = 0; i <= 1000000000; i++) {// 边赋值边运算——462
            a = b + (b = a) * 0;
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();
        for (int i = 0; i <= 1000000000; i++) {// 加减减交换——898
            a += b;
            b = a - b;
            a -= b;
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();
        for (int i = 0; i <= 1000000000; i++) {// 用中间变量交换——449
            t = a;
            a = b;
            b = t;
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();
        for (int i = 0; i <= 1000000000; i++) {// 异或交换——896
            a ^= b;
            b ^= a;
            a ^= b;
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

说明

注释后面的数字是我的电脑运行10亿次交换所用的时间(毫秒)

总结

如果没有强迫症或者硬性要求,用中间变量交换是最好的方法。

如果要走非主流边赋值边运算是最有效率的。

加减减和异或虽然看起来挺酷的,但是运算多,慢是应该的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 02:57:18

java交换两个数的常见方法及效率测试的相关文章

用多种方法交换两个数的值

今天上了C语言课,老师讲了有关交换两个数的问题.课后,经过自己的思考和总结,我得出了以下几种方法.虽然这个问题的方法还有很多,但我目前只了解到了这五种方法,希望大家多提建议和意见.其他的方法待补充奥... 法一: 大家最容易想的方法,首先设一个临时变量,利用临时变量将两个数交换.下面是实现它的代码: #include<stdio.h> int main() {   int num1=5,num2=10,tmp=0;   printf("before:\n");   prin

交换两个数的C语言程序

今天是第一次接触C语言,之前有一点C++的基础,所以学习起来还挺顺手的.下来分享一下写的一个关于交换两个数的C语言代码.可能这些还存在很大的问题,希望大家可以指正. 方法一:允许创建第三个变量 #include<stdio.h> int main() { int a=10; int b=20; int tmp=a; a=b; b=tmp; printf("%d\n",a); printf("%d\n",b); return 0; } 方法二:不创建新的变

不使用中间变量交换两个数. 求平均数考虑溢出

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> //不使用中间变量交换两个数的值 void exchange_num(int *a, int *b) { ①* a =*a + *b;    //适用范围广 * b = *a -* b; * a =* a - *b; ②* a = (*a )*(*b); * b = (*a )/(*b); * a = (*a ) / (*b);//当两个数有

20140806 交换两个数 extern &ldquo;C&rdquo;用法

1.交换两个数 方法1.a+b有可能越界 a=a+b; b=a-b; a=a-b; 方法二.不会越界 a=a^b b=a^b; a=a^b;   2.extern "C"用法 ( 自己总结: 1.C++语言引用C语言函数时(void fun(int a,int b),void fun(int a,float b)),由于C++有重载功能,编译器按C++的方式编译该函数后产生的名字五花八门(_fun_int_int和_fun_int_float). 2.而被调用的c语言函数库,或者.c文

交换两个数的值,不适用第三个变量

交换两个数的值,不适用第三个变量 一.源代码:SwapTwoNumber.java 1 package cn.com.zfc.help; 2 3 /** 4 * 不适用中间变量交换两个数 5 * 6 * @author zfc 7 * 8 */ 9 public class SwapTwoNumber { 10 public static void main(String[] args) { 11 12 /* 1.第一种交换方式,位运算:^(异或) */ 13 System.out.printl

c语言实现交换两个数的值

C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述. 不使用中间变量: 1 // 异或, a^=b^=a^=b; 2 a ^= b; 3 b ^= a; 4 a ^= b; 5 6 // 加减 7 a = a + b; 8 b = a - b; 9 a = a - b; 10 11 // 乘除 12 a = a * b; 13 b = a / b; 14 b = a/ b; 使用中间变量: 1 // 需临时空间 2 temp = a; 3 a = b; 4 b = temp; 正如你所

关于交换两个数的问题

前人栽树,后人乘凉 本讲内容:关于交换两个数 对于Java来说,对于基本数据类型,Java传递的是一个拷贝副本,根本不能改变参数的值.可以通过数组来完成,因为数组传递的是地址. 例一: public class Text { public static void main(String[] args) { int a=4; int b=5; change(a,b); System.out.println("主函数:"+a+","+b); } public stati

不占用任何额外空间的情况下交换两个数的值

题目 假如有x.y两个数,如何在不占用任何额外空间的情况下交换两个数的值? 思路 平时我们在交换两个数的值时,往往会用一个中间数temp来实现效果,现在需要不占用任何额外空间,自然就不能使用这种寻常的方法了:这里可以有两种方法来实现. 方法一 int x = 5; int y = 10; x = x + y; y = x - y; x = x - y; 先将两个数之和附给x,接着x-y自然就是原本x的值,这时候赋值给y,y就拿到了x原本的值.此时x依然是两个数之和,再进行x-y自然就是原本x的值

用swap 交换两个数

#include<stdio.h>main(){ void swap(int *p1,int *p2);//定义swap函数,用于交换.  int *p,*q; int a,b; //定义两个指针变量和两个数a和b  printf("请输入两个数:");  scanf("%d,%d",&a,&b);//输入两个数  p=&a; q=&b;//将p和q分别指向a和b的地址  swap(p,q);//调用swap函数对p和q执