Open In App

Python3 Program to Count rotations required to sort given array in non-increasing order

Last Updated : 05 Sep, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Given an array arr[] consisting of N integers, the task is to sort the array in non-increasing order by minimum number of anti-clockwise rotations. If it is not possible to sort the array, then print “-1”. Otherwise, print the count of rotations.

Examples:

Input: arr[] = {2, 1, 5, 4, 3}
Output: 2
Explanation: Two anti-clockwise rotations are required to sort the array in decreasing order, i.e. {5, 4, 3, 2, 1}

Input: arr[] = {2, 3, 1}
Output: -1

Approach: The idea is to traverse the given array arr[] and count the number of indices satisfying arr[i + 1] > arr[i]. Follow the steps below to solve the problem:

  • Store the count of arr[i + 1] > arr[i] in a variable and also store the index when arr[i+1] > arr[i].
  • If the value of count is N – 1, then the array is sorted in non-decreasing order. The required steps are exactly (N – 1).
  • If the value of count is 0, then the array is already sorted in non-increasing order.
  • If the value of count is 1 and arr[0] ? arr[N – 1], then the required number of rotations is equal to (index + 1), by performing shifting of all the numbers upto that index. Also, check if arr[0] ? arr[N – 1] to ensure if the sequence is non-increasing.
  • Otherwise, it is not possible to sort the array in non-increasing order.

Below is the implementation of the above approach:

Python
# Python program for the above approach
 
# Function to count minimum anti-
# clockwise rotations required to
# sort the array in non-increasing order
def minMovesToSort(arr, N) :
    
    # Stores count of arr[i + 1] > arr[i]
    count = 0
 
    # Store last index of arr[i+1] > arr[i]
    index = 0
 
    # Traverse the given array
    for i in range(N-1):
 
        # If the adjacent elements are
        # in increasing order
        if (arr[i] < arr[i + 1]) :
 
            # Increment count
            count += 1
 
            # Update index
            index = i
        
    # Print result according
    # to the following conditions
    if (count == 0) :
        print("0")
    
    elif (count == N - 1) :
        print( N - 1)
    
    elif (count == 1
            and arr[0] <= arr[N - 1]) :
        print(index + 1)
    
    # Otherwise, it is not
    # possible to sort the array
    else :
        print("-1")
 
# Driver Code

# Given array
arr = [ 2, 1, 5, 4, 2 ]
N = len(arr)
 
# Function Call
minMovesToSort(arr, N)

# This code i contributed by sanjoy_62.

 
 


Output
2


 

Time Complexity: O(N)
Auxiliary Space: O(1)


Please refer complete article on Count rotations required to sort given array in non-increasing order for more details!
 



Next Article

Similar Reads