题目来自网上
题目:给定一个数组arr,其中包括0元素和非0元素,要求对数组元素进行重新排序
要求:
1、所有0元素在左,所有非零元素在后,且非零元素在重排前后相对位置不变
2、时间复杂度为O(n),空间复杂度O(1)
举例:
原始数据:0、1、2、0、3
输出数据:0、0、1、2、3
思路:不能像快排一样移动,那样元素顺序会打乱。为了防止数据被打乱,可以从右端开始处理
代码一:
void ReOrder(int arr[],int nLen)
{
assert(arr != NULL && nLen > 0);
int nPosZero = nLen - 1;
for (int i = nLen - 1;i >= 0;i--)
{
if (arr[i] != 0 && arr[nPosZero] == 0)
{
arr[nPosZero] = arr[i];
arr[i] = 0;
nPosZero--;
}
else if (arr[nPosZero] != 0)
{
nPosZero--;
}
}
}
稍微改进下,减少下比较次数
void ReOrder(int arr[],int nLen)
{
assert(arr != NULL && nLen > 0);
int nPosZero = nLen - 1;
for (int i = nLen - 1;i >= 0;i--)
{
if (arr[i] != 0)
{
if (arr[nPosZero] == 0)
{
arr[nPosZero] = arr[i];
arr[i] = 0;
}
nPosZero--;
}
}
}
代码二:
void ReOrder(int arr[],int nLen)
{
assert(arr != NULL && nLen > 0);
int nCount = 0;
int nPosZero = nLen - 1;
for (int i = nLen - 1;i >= 0;i--)
{
if (arr[i] == 0)
{
nCount++;
}
else
{
if (nCount != 0)
{
arr[i + nCount] = arr[i];
}
}
}
for (int i = 0;i < nCount;i++)
{
arr[i] = 0;
}
}