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

原文地址:https://www.cnblogs.com/huty/p/8519124.html