交换两个数字的方法

今天在写快排的时候遇到一个问题,排序的结果中某些数字莫名被清零。
断点调试之后发现原来是交换函数的问题。
大体上说,交换两个数字的方法有三种。这里以交换数组中的两个数字为例子做说明。

  1. 中间参数。
void swap(int[] array,int a,int b){
        int tmp = array[a];
        array[a] = array[b];
        array[b] = tmp;
    }
  1. 加减法。注意这里的一个问题:如果 ij 相等的话 array[i]array[j] 两个数字是一样的 ,对应下标的数组元素会在 ② 处被清零。
void exchange(int[] array, int i, int j) {
        array[i] = array[i] + array[j];
        array[j] = array[i] - array[j]; //②
        array[i] = array[i] - array[j];
    }
  1. 位运算。这里需要注意的是如果 ij相等的话,数字会在 ① 处被清零。
 void exchange(int[] array, int i, int j) {
        array[i] = array[i] ^ array[j]; //①
        array[j] = array[i] ^ array[j];
        array[i] = array[i] ^ array[j];
    }

所以,还是不要写太炫酷的代码,如果不清楚里面的tricks的话。老实本分的第一种方法永远不犯错。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,886评论 0 2
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 12,098评论 6 13
  • 老妈喜欢看非诚勿扰,每天中午十一点必定守在电视前,坐等熟悉的音乐响起,然后瞪大眼睛,开始一天中她最热情的时刻。 而...
    二方阅读 772评论 2 11
  • 文/鱼儿游,月儿追 折叠 碎片般的记忆 存放 在不知名的空间 执笔 书写下逝去的过往 粘贴 历史悠久的邮票 徘徊 ...
    弱鱼姑娘阅读 305评论 0 2

友情链接更多精彩内容