• in-place数据交换


    实现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=1001Y=0111进行原位数据交换操作的验证:

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


    2015-9-24 艺少

  • 相关阅读:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files/编译错误
    连接数据库配置 System.Data.Common.DbProviderFactory
    c# socket 发送邮件
    code first 数据迁移
    adb shell monkey
    汇编语言学习小总结
    zookeeper快速安装配置
    编译自己的Hadoop Eclipse插件
    在Windos上使用Eclipse进行Hadoop开发的环境搭建
    Hive安装配置以及整合HBase和hadoop
  • 原文地址:https://www.cnblogs.com/huty/p/8519124.html
Copyright © 2020-2023  润新知