Here is my code for this question:
# Python code block
import heapq
def sortArrayByParity(nums):
left=0
right=len(nums)-1
swap=0
while left<right:
if (nums[left]%2)!=0 and (nums[right]%2)==0:
nums[left],nums[right]=nums[right],nums[left]
left+=1
right-=1
swap+=1
elif (nums[left]%2)!=0 and (nums[right]%2)!=0:
right-=1
elif (nums[left]%2)==0:
left+=1
return nums,left,swap
def min_swap_sort(num):
key_dict=dict([(num[i],i) for i in range(len(num))])
heap=num[::]
heapq.heapify(heap)
swap=0
for i in range(len(num)):
smallest=heapq.heappop(heap)
if num[i]!=smallest:
tmp=num[i]
num[i], num[key_dict[smallest]]=smallest, num[i]
key_dict[smallest],key_dict[tmp]=key_dict[tmp],key_dict[smallest]
swap+=1
return swap,num
def even_odd_sort(num):
nums,left,swapb=sortArrayByParity(num)
swapo,numo=min_swap_sort(nums[:left])
nume = [ -x for x in nums[left:]]
swape,nume=min_swap_sort(nume)
nume = [ -x for x in nume]
print(numo+nume)
return swapo+swapb+swape
print(even_odd_sort([7,3,8,1,5,6,2,4]))
Run-time: O(nlogn)
Space Complexity: O(n)