实现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 艺少

转载于:https://www.cnblogs.com/huty/p/8519124.html

in-place数据交换相关推荐

  1. c语言链表交换,求单链表的数据交换解决思路

    当前位置:我的异常网» C语言 » 求单链表的数据交换解决思路 求单链表的数据交换解决思路 www.myexceptions.net  网友分享于:2013-11-04  浏览:14次 求单链表的数据 ...

  2. 常用的数据交换格式有哪些_Linux后台开发6大常用的开源库,让你在同行中脱颖而出...

    后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥 ...

  3. 实现不同域(Domain)之间的数据交换(转)

    引言 前些天在对公司原有的 web 应用进行改版时遇到一个问题,当时需要从原有的应用中提取出一部分,用一个更为通用的来进行替换,并且仍然保留原有的应用接口.原有的应用属于 news.mycompany ...

  4. XML和JSON 数据交换格式

    为什么80%的码农都做不了架构师?>>>    一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...

  5. 4.1.2 数据交换方式

    4.1.2 数据交换方式

  6. 互联网协议 — 数据交换技术

    目录 文章目录 目录 数据交换技术 传统的 2 层交换技术 具有路由功能的 3 层交换技术 具有网络服务功能的 7 层交换技术 数据交换技术 交换技术是随着电话通信的发展和使用而出现的通信技术.电话刚 ...

  7. NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息...

    NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息.也许它不能象tcpdump那样提供网络流量的完整记录,但是当汇集起来时,它更加易于管理和易读.Netflo ...

  8. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★

    文章目录 一.网络层功能 二.数据交换方式 ★ 三.IP 数据报 ★ 四. IPv4 地址 ★★ 1 . IP 地址 发展 : 2 . 分类 IP 地址 3 . NAT 转换 4 . 子网划分 5 . ...

  9. 哈工大计算机网络Week2-网络应用数据交换

    目录 网络应用数据交换 P2P应用:原理与文件分发 纯P2P架构 文件分发:客户机/服务器 vs. P2P CS 为什么是这样的?不应该传送和发出难道是并行的??? P2P P2P文件分发典型例子:B ...

  10. 计算机网络知识点2——数据交换、码分多路复用

    数据交换 为什么需要数据交换? 数据交换的类型 电路交换的特点 最典型电路交换网络:电话网络 电路交换的三个阶段: 1. 建立连接(呼叫/电路建立) 2.  通信 3. 释放连接(拆除电路) 独占资源 ...

最新文章

  1. Android Studio – Cannot resolve symbol ‘R’
  2. vue 引入bootstarp --webpack
  3. 咏南LINUX中间件
  4. 小冰和她的兄弟姐妹们组团出道:唱歌跳舞写文章样样都会,而且都开放版权...
  5. Hadoop书籍和网络资源介绍
  6. 【GAN】如何生动有趣地对GAN进行可视化?Google的GAN Lab推荐你了解一下
  7. RabbitMQ——消息发布订阅
  8. vue实现单页面多标签页
  9. 下载最新adb(platform-tools)
  10. github private链接访问_Hands-On Design Patterns With C++(十八)访问者模式与多分派(下)...
  11. carmaker/matlab联合仿真(三) 生成车道线点,拟合多项式方程
  12. weblogic下载及安装
  13. Maven系列第4篇:仓库详解
  14. TheChroniclesOfNarnia写作年代
  15. 总结一下关于扫描电子显微镜与背散射电子探测器
  16. cocosCreator 骨骼动画
  17. 强迫症狂喜!PC端相册还能智能分类!
  18. 微信小程序map组件点聚合初次使用的坑
  19. 境外IP判断一种实现方案
  20. 圣地亚哥分校 计算机,美国加州大学圣地亚哥分校计算机科学专业.pdf

热门文章

  1. oracle 查看内存参数配置,Oracle内存参数配置及版本问题
  2. mysql int number_Oracle/MySQL decimal/int/number 转字符串
  3. html 怎么置顶表格,表格(Table)表头固定,内容上滚【5个实例】
  4. three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发
  5. 【渝粤教育】国家开放大学2018年秋季 0266-22T设计构成 参考试题
  6. 【渝粤题库】陕西师范大学300018 世界史(下)
  7. 【渝粤教育】广东开放大学 人工智能 形成性考核 (55)
  8. 常见的无线传感器数据采集传输系统的三种组网
  9. 你一定要了解的NB-IoT !
  10. php中n12br,PHP常见字符串操作函数与用法总结