# Number of subarrays required to be rearranged to sort the given array

• Difficulty Level : Medium
• Last Updated : 05 Jan, 2022

Given an array arr[] consisting of the first N natural numbers, the task is to find the minimum number of subarrays required to be rearranged such that the resultant array is sorted.

Examples:

Input: arr[] = {2, 1, 4, 3, 5}
Output: 1
Explanation:
Operation 1: Choose the subarray {arr, arr}, i.e. { 2, 1, 4, 3 }. Rearrange the elements of this subarray to {1, 2, 3, 4}. The array modifies to {1, 2, 3, 4, 5}.

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

Approach: The given problem can be solved by observing the following scenarios:

• If the given array arr[] is already sorted, then print 0.
• If the first and the last element is 1 and N respectively, then only 1 subarray either arr[1, N – 2] or arr[2, N – 1] needs to be sorted. Therefore, print 1.
• f the first and the last element is N and 1 respectively, then 3 subarrays i.e., arr[0, N – 2], arr[1, N – 1], and arr[0, 1] need to be sorted. Therefore, print 3.
• Otherwise, sort the two subarrays i.e., arr[1, N – 1], and arr[0, N – 2].

Therefore, print the count of minimum number of subarrays required to be rearranged.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach` `#include ``using` `namespace` `std;` `// Function to count the number``// of subarrays required to be``// rearranged to sort the given array``void` `countSubarray(``int` `arr[], ``int` `n)``{``    ``// Base Case``    ``int` `ans = 2;` `    ``// Check if the given array is``    ``// already sorted``    ``if` `(is_sorted(arr, arr + n)) {``        ``ans = 0;``    ``}` `    ``// Check if the first element of``    ``// array is 1 or last element is``    ``// equal to size of array``    ``else` `if` `(arr == 1``             ``|| arr[n - 1] == n) {``        ``ans = 1;``    ``}``    ``else` `if` `(arr == n``             ``&& arr[n - 1] == 1) {``        ``ans = 3;``    ``}` `    ``// Print the required answer``    ``cout << ans;``}` `// Driver Code``int` `main()``{``    ``int` `arr[] = { 5, 2, 3, 4, 1 };``    ``int` `N = ``sizeof``(arr) / ``sizeof``(arr);``    ``countSubarray(arr, N);` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG{` `// Function that returns 0 if a pair``// is found unsorted``static` `int` `arraySortedOrNot(``int` `arr[], ``int` `n)``{``    ` `    ``// Array has one or no element or the``    ``// rest are already checked and approved.``    ``if` `(n == ``1` `|| n == ``0``)``        ``return` `1``;` `    ``// Unsorted pair found (Equal values allowed)``    ``if` `(arr[n - ``1``] < arr[n - ``2``])``        ``return` `0``;` `    ``// Last pair was sorted``    ``// Keep on checking``    ``return` `arraySortedOrNot(arr, n - ``1``);``}` `// Function to count the number``// of subarrays required to be``// rearranged to sort the given array``static` `void` `countSubarray(``int` `arr[], ``int` `n)``{``    ` `    ``// Base Case``    ``int` `ans = ``2``;` `    ``// Check if the given array is``    ``// already sorted``    ``if` `(arraySortedOrNot(arr, arr.length) != ``0``)``    ``{``        ``ans = ``0``;``    ``}``    ` `    ``// Check if the first element of``    ``// array is 1 or last element is``    ``// equal to size of array``    ``else` `if` `(arr[``0``] == ``1` `||``             ``arr[n - ``1``] == n)``    ``{``        ``ans = ``1``;``    ``}``    ``else` `if` `(arr[``0``] == n &&``             ``arr[n - ``1``] == ``1``)``    ``{``        ``ans = ``3``;``    ``}` `    ``// Print the required answer``    ``System.out.print(ans);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int` `arr[] = { ``5``, ``2``, ``3``, ``4``, ``1` `};``    ``int` `N = arr.length;``    ` `    ``countSubarray(arr, N);``}   ``}` `// This code is contributed by susmitakundugoaldanga`

## Python3

 `# Python3 program for the above approach` `# Function to count the number``# of subarrays required to be``# rearranged to sort the given array``def` `countSubarray(arr, n):``    ` `    ``# Base Case``    ``ans ``=` `2``    ` `    ``# Check if the given array is``    ``# already sorted``    ``if` `(``sorted``(arr) ``=``=` `arr):``        ``ans ``=` `0``        ` `    ``# Check if the first element of``    ``# array is 1 or last element is``    ``# equal to size of array``    ``elif` `(arr[``0``] ``=``=` `1` `or` `arr[n ``-` `1``] ``=``=` `n):``        ``ans ``=` `1``    ``elif` `(arr[``0``] ``=``=` `n ``and` `arr[n ``-` `1``] ``=``=` `1``):``        ``ans ``=` `3``        ` `    ``# Print the required answer``    ``print``(ans)` `# Driver Code``arr ``=` `[ ``5``, ``2``, ``3``, ``4``, ``1` `]``N ``=` `len``(arr)` `countSubarray(arr, N)` `# This code is contributed by amreshkumar3`

## C#

 `// C# program for the above approach``using` `System;``using` `System.Collections.Generic;` `class` `GFG{` `// Function that returns 0 if a pair``// is found unsorted``static` `int` `arraySortedOrNot(``int` `[]arr, ``int` `n)``{``    ` `    ``// Array has one or no element or the``    ``// rest are already checked and approved.``    ``if` `(n == 1 || n == 0)``        ``return` `1;` `    ``// Unsorted pair found (Equal values allowed)``    ``if` `(arr[n - 1] < arr[n - 2])``        ``return` `0;` `    ``// Last pair was sorted``    ``// Keep on checking``    ``return` `arraySortedOrNot(arr, n - 1);``}` `// Function to count the number``// of subarrays required to be``// rearranged to sort the given array``static` `void` `countSubarray(``int` `[]arr, ``int` `n)``{``    ` `    ``// Base Case``    ``int` `ans = 2;` `    ``// Check if the given array is``    ``// already sorted``    ``if` `(arraySortedOrNot(arr, arr.Length) != 0)``    ``{``        ``ans = 0;``    ``}``    ` `    ``// Check if the first element of``    ``// array is 1 or last element is``    ``// equal to size of array``    ``else` `if` `(arr == 1 ||``             ``arr[n - 1] == n)``    ``{``        ``ans = 1;``    ``}``    ``else` `if` `(arr == n &&``             ``arr[n - 1] == 1)``    ``{``        ``ans = 3;``    ``}` `    ``// Print the required answer``    ``Console.Write(ans);``}` `// Driver Code``public` `static` `void` `Main()``{``    ``int` `[]arr = { 5, 2, 3, 4, 1 };``    ``int` `N = arr.Length;``    ` `    ``countSubarray(arr, N);``}   ``}` `// This code is contributed by bgangwar59`

## Javascript

 ``

Output:

`3`

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

My Personal Notes arrow_drop_up