实现in-place的数据交换


声明:引用请注明出处http://blog.csdn.net/lg1259156776/


经典的排序问题

问题描述

一个数组中包含两个已经排好序的子数组,设计一个in-place(原位操作)算法来对这个数组排序。测试数据为 a[] = 1 4 5 7 8 9  2 3 6 10 11 。

问题分析

排序是一个非常经典的算法设计问题,这个不是难点,难点在于设定的in-place操作,意思是所有的操作都是”就地“操作,不允许进行移动。在我的博文《排序算法一:直接插入排序》中讲到了对于排序算法,时间复杂度在于项目间的比较和移动次数,这里的in-place操作指的就是设定移动次数为0。分析排序算法中为何需要项目间的移动,主要是为了节省内存消耗(空间复杂度),在原有的数组内存空间上进行排序,这样就需要为已经排好序的数据倒腾内存,通常的解决办法是将要倒腾的内存位置上的未排序的数据存在一个临时变量(temp)进行保存,然后其它的数据依次移动。这样的算法额外的空间消耗只有O(1)。题目中的要求是这个临时变量也不能用。实际上是要解决in-place的数据交换操作。

解决方案:in-place数据交换

通过异或操作实现原位数据交换。

#include <iostream>

using namespace std;

void swap(int &x, int &y)
{
x = x ^ y;
y = x ^ y;
x = x ^ y;
} void insertion(int a[], int sz)
{
for(int i=1; i < sz; i++) {
int j = i;
while(j > 0) {
if(a[j-1] > a[j]) swap(a[j-1],a[j]);
j--;
}
}
for(int i = 1; i < sz; i++) cout << a[i] << " ";
} int main()
{
int a[] = { 1, 4, 5, 7, 8, 9, 2, 3, 6, 10, 11 };
int size = sizeof(a)/sizeof(int);
for (int i = 0; i < size; i++) cout << a[i] << " ";
cout << " ==> " << endl;
insertion(a, size);
cout << endl;
return 0;
}

输出为:

1 4 5 7 8 9 2 3 6 10 11   ==>
2 3 4 5 6 7 8 9 10 11

分析原位数据交换

设定X=1001,Y=0111进行原位数据交换操作的验证:

X=X xor Y=1110Y=X xor Y=1001X=X xor Y=0111

从中可以看出X和Y在不借助任何临时变量的存储前提下,in-place的完成了交换。


2015-9-24 艺少

最新文章

  1. 使用Visual Studio 2015 Community 开发windows服务
  2. SQL Server 2014,改善的临时表缓存
  3. SDL2 Tutorial
  4. 纯原生js移动端图片压缩上传插件
  5. solrj6.2异常--Expected mime type application/octet-stream but got text/html.
  6. overflow: hidden用法,不仅仅是隐藏溢出
  7. ASP.NET5 静态文件
  8. javascript第七课js函数
  9. bat文件自动编译InnoSetup脚本
  10. 记hive select distinct 多列 误区一则
  11. SimpleRpc-网络事件响应Reactor设计模式
  12. python基础(四)字符串处理
  13. 对TIMIT数据进行格式转换(SPHERE2WAV(RIFF))
  14. Zabbix系列之五——监控TCP端口
  15. Bootstrap3基础 navbar 导航条 简单示例
  16. c++虚函数重写的权限问题
  17. 记一次ajax交互问题
  18. C#实现控制Windows系统关机、重启和注销的方法
  19. utf-8-validation
  20. 如何线程安全的使用HashMap

热门文章

  1. Codeforces Round #555 (Div. 3) C1,C2【补题】
  2. 四十五.加密与解密 AIDE入侵检测系统 扫描与抓包
  3. ICPC 2019-2020 North-Western Russia Regional Contest
  4. [JXOI2017]颜色
  5. python3 数据类型测试
  6. TensorFlow(五):手写数字识别加强版
  7. 2019暑期金华集训 Day3 字符串
  8. P1095 守望者的逃离——DP?贪心?
  9. C++标准库分析总结(三)——&lt;迭代器设计原则&gt;
  10. springboot项目整合swagger2出现的问题