数组中用异或进行数值交换需要注意的问题
来源:互联网 发布:java基础教程视频下载 编辑:程序博客网 时间:2024/06/01 09:30
一个简单的交换两个数值的函数可以这么写:
void swap(int x, int y){ int temp = x; x = y; y = temp;}
高级一点的可以这么写:
void swap(int x, int y){ x = x^y; y = x^y; x = x^y;}
但是,当需要交换数组中的两个值时,第二种写法就存在bug。函数如下:
void swap(int[] array, int i, int j){ //i,j为需要交换数值的数组下标 array[i] = array[i]^array[j]; array[j] = array[i]^array[j]; array[i] = array[i]^array[j];}
对于某些排序算法,如快排,在算法运行的过程中可能会交换两个相同下标的值,这时的函数调用就会出现swap(array,i,i)的情况,
如果swap函数是第二种实现,根据异或的运算规则---两个相同的数异或结果为0---就会把array[i]的值变成零。
所以正确写法如下:
void swap(int[] array, int i, int j){ //i,j为需要交换数值的数组下标 if(i == j) return;//下标相同直接返回 array[i] = array[i]^array[j]; array[j] = array[i]^array[j]; array[i] = array[i]^array[j];}
快排中的partition函数可能出现交换相同下标值,代码如下:
int partition(int[] array, int start, int end){ int pivot = array[end]; int i = start - 1; for(int j = start;j<end;j++) { if(array[j] < pivot) { i++; swap(array,i,j);//行1 } } i++; swap(array,i,end); return i;}根据以上代码,当数组中的第一个数比最后一个数(即pivot)小的时候(如array = {1,2,3,})就会出现调用swap(array,0,0)的情况,从而导致array[0]变成零。
0 0
- 数组中用异或进行数值交换需要注意的问题
- 用异或操作实现的交换函数用以实现数组逆置中需要注意的问题
- 黑马程序员一java中用异或的方式进行两个变量的赋值变换,需要注意的数据类型问题
- 异或交换数值
- 通过异或交换变量的数值
- 基于异或(^)运算进行数值交换的可行性分析
- 利用异或交换数值
- 新手站长交换友情链接需要注意的问题
- 字符数组初始化需要注意的问题
- 基于异或(^)运算的数值交换运算
- 异或交换数组元素的隐患
- js:数组重排序问题:如何使用sort()方法按数值的大小进行升序或降序排列
- Java Arrays类进行数组排序需要注意的事情
- 利用指针或引用进行两个数值交换
- [体会]用异或交换数值
- Java中用异或交换值
- BL或中断返回需要注意的一些细节问题 .
- FLOAT或DOUBLE列与具有数值类型的数值进行比较 问题
- 将代码view和xibview放到SB中
- 百度编辑器图片在线流量返回url修改
- 用Intent传递List
- Unity3D之协程(Coroutines & Yield )
- LinearLayout和RelativeLayout
- 数组中用异或进行数值交换需要注意的问题
- 界首代办医院诊断证明
- JVM(java 虚拟机)内存设置
- 宁国代办医院诊断证明
- Fresco图片加载框架之自总结Demo分享
- 福清代办医院诊断证明
- 长乐代办医院诊断证明
- 永安代办医院诊断证明
- Linux常用命令大全