把数组中的0移到数组前面,其它数字移到后面,并且保持数字间的相对顺序

504 篇文章 0 订阅
// 在O(n)时间内把数组中的0移到数组前面,其他数字移到数组后面,并保持相对顺序.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

/*
Given an Array With random 0s and non 0 numbers, shift all the 0s to the beginning and non 0s to the rear. 
Eg: 1,9,8,4,0,0,2,7,0,6,0 
Out put 0,0,0,0,1,9,8,4,2,7,6 
i.e order of numbers not to change. Do it in place
*/


void resortArray(int A[], int len)
{
	int *pZero;
	int *pNum;

	pZero = pNum = A+len-1;

	// find the first position of 0 (from right to left)
	while (*pZero != 0)
		pZero--;

	// find the first position of !0 (from right to left)
	pNum = pZero-1;
	while (*pNum == 0)
		pNum--;

	while (pZero >= A && pNum >= A)
	{
		*pZero-- = *pNum;
		*pNum--  = 0;

		while (*pZero != 0 && pZero >= A)
			pZero--;

		while (*pNum == 0 && pNum >= A)
			pNum--;
		
	}

}


void printArray(int A[], int len)
{
	for (int idx = 0; idx < len; idx++)
	{
		printf("%d ", A[idx]);
	}
	printf("\r\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
	int Arr[] = {10,44,0,0,3,0,0,5,1,9,8,4,0,0,2,7,0,6,11,12,13};
	int arrLen = sizeof(Arr)/sizeof(Arr[0]);

	printArray(Arr, arrLen);
	resortArray(Arr, arrLen);
	printArray(Arr, arrLen);



	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值