空间复杂度为0的数据交换
声明:引用请注明出处http://blog.csdn.net/finish_dream/article/details/70184979
问题分析
排序是一个非常经典的算法设计问题,这个不是难点,难点在于设定的in-place操作,意思是所有的操作都是”就地“操作,不允许进行移动。在我的博文《排序算法一:直接插入排序》中讲到了对于排序算法,时间复杂度在于项目间的比较和移动次数,这里的in-place操作指的就是设定移动次数为0。分析排序算法中为何需要项目间的移动,主要是为了节省内存消耗(空间复杂度),在原有的数组内存空间上进行排序,这样就需要为已经排好序的数据倒腾内存,通常的解决办法是将要倒腾的内存位置上的未排序的数据存在一个临时变量(temp)进行保存,然后其它的数据依次移动。这样的算法额外的空间消耗只有O(1)。题目中的要求是这个临时变量也不能用。实际上是要解决in-place的数据交换操作。
解决方法:通过异或操作实现原位数据交换
C#代码
/// <summary>
/// 交换元素
/// </summary>
/// <param name="x">元素1</param>
/// <param name="y">元素2</param>
private static void swap(ref int x, ref int y)
{
x = x ^ y;
y = x ^ y;
x = x ^ y;
}
/// <summary>
/// 插入排序(加强版)
/// </summary>
/// <param name="Array">待排序数组</param>
/// <param name="N">数组元素个数</param>
/// <returns></returns>
public static int[] InsertionSortUp(int[] Array, int N)
{
for (int P = 1; P < N; P++)
{
int j = P;
while (j > 0)
{
if (Array[j - 1] > Array[j])
swap(ref Array[j - 1], ref Array[j]);
j--;
}
}
return Array;
}