To move all 0's to the end of the array while maintaining the order of the non-zero elements, we can use a two-pointer approach. We can initialize two pointers, one for the current element and one for the position where the next non-zero element should be placed. We can iterate through the array with the current pointer, and whenever we encounter a non-zero element, we can swap it with the element at the next non-zero position and increment the next non-zero position pointer. This way, all non-zero elements will be moved to the front of the array in their relative order, and all the 0's will be pushed to the end of the array.
Here's how the code would look like:
```
def moveZeroes(nums):
nextNonZeroPos = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[nextNonZeroPos], nums[i] = nums[i], nums[nextNonZeroPos]
nextNonZeroPos += 1
```
In terms of operations, this approach would take O(n) time complexity as we need to iterate through the array once, and the space complexity would be O(1) as we are only using a constant amount of extra space for the two pointers.