Sort elements of the array that occurs in between multiples of K
Given an array arr[] and an integer K. The task is to sort the elements that are in between any two multiples of K.
Examples:
Input: arr[] = {2, 1, 13, 3, 7, 8, 21, 13, 12}, K = 2
Output: 2 1 3 7 13 8 13 21 12
The multiples of 2 in the array are 2, 8 and 12.
The elements that are in between the first two multiples of 2 are 1, 13, 3 and 7.
Hence, these elements in sorted order are 1, 3, 7 and 13.
Similarly, the elements between 8 and 12 in sorted order will be 13 and 21.Input: arr[] = {11, 10, 9, 7, 4, 5, 12, 22, 13, 15, 17, 16}, K = 3
Output: 11 10 9 4 5 7 12 13 22 15 17 16
Approach: Traverse the array and keep track of the multiples of K, starting from the 2nd multiple of K sort every element between the current and the previous multiple of K. Print the updated array at the end.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include<bits/stdc++.h> using namespace std; // Utility function to print // the contents of an array void printArr( int arr[], int n) { for ( int i = 0; i < n; i++) cout << (arr[i]) << " " ; } // Function to sort elements // in between multiples of k void sortArr( int arr[], int n, int k) { // To store the index of // previous multiple of k int prev = -1; for ( int i = 0; i < n; i++) { if (arr[i] % k == 0) { // If it is not the // first multiple of k if (prev != -1) // Sort the elements in between // the previous and the current // multiple of k sort(arr + prev + 1, arr + i); // Update previous to be current prev = i; } } // Print the updated array printArr(arr, n); } // Driver code int main() { int arr[] = {2, 1, 13, 3, 7, 8, 21, 13, 12}; int n = sizeof (arr) / sizeof (arr[0]); int k = 2; sortArr(arr, n, k); } // This code is contributed by // Surendra_Gangwar |
Java
// Java implementation of the approach import java.util.Arrays; class GFG { // Utility function to print // the contents of an array static void printArr( int arr[], int n) { for ( int i = 0 ; i < n; i++) System.out.print(arr[i] + " " ); } // Function to sort elements // in between multiples of k static void sortArr( int arr[], int n, int k) { // To store the index of // previous multiple of k int prev = - 1 ; for ( int i = 0 ; i < n; i++) { if (arr[i] % k == 0 ) { // If it is not the // first multiple of k if (prev != - 1 ) // Sort the elements in between // the previous and the current // multiple of k Arrays.sort(arr, prev + 1 , i); // Update previous to be current prev = i; } } // Print the updated array printArr(arr, n); } // Driver code public static void main(String[] args) { int arr[] = { 2 , 1 , 13 , 3 , 7 , 8 , 21 , 13 , 12 }; int n = arr.length; int k = 2 ; sortArr(arr, n, k); } } |
Python3
# Python3 implementation of the approach # Utility function to print # the contents of an array def printArr(arr, n) : for i in range (n) : print (arr[i], end = " " ); # Function to sort elements # in between multiples of k def sortArr(arr, n, k) : # To store the index of # previous multiple of k prev = - 1 ; for i in range (n) : if (arr[i] % k = = 0 ) : # If it is not the first # multiple of k if (prev ! = - 1 ) : # Sort the elements in between #the previous and the current # multiple of k temp = arr[prev + 1 :i]; temp.sort(); arr = arr[ : prev + 1 ] + temp + arr[i : ]; # Update previous to be current prev = i; # Print the updated array printArr(arr, n); # Driver code if __name__ = = "__main__" : arr = [ 2 , 1 , 13 , 3 , 7 , 8 , 21 , 13 , 12 ]; n = len (arr); k = 2 ; sortArr(arr, n, k); # This code is contributed by Ryuga |
C#
// C# implementation of the approach using System.Collections; using System; class GFG { // Utility function to print // the contents of an array static void printArr( int []arr, int n) { for ( int i = 0; i < n; i++) Console.Write(arr[i] + " " ); } // Function to sort elements // in between multiples of k static void sortArr( int []arr, int n, int k) { // To store the index of // previous multiple of k int prev = -1; for ( int i = 0; i < n; i++) { if (arr[i] % k == 0) { // If it is not the // first multiple of k if (prev != -1) // Sort the elements in between // the previous and the current // multiple of k Array.Sort(arr, prev + 1, i-(prev + 1)); // Update previous to be current prev = i; } } // Print the updated array printArr(arr, n); } // Driver code public static void Main(String []args) { int []arr = { 2, 1, 13, 3, 7, 8, 21, 13, 12 }; int n = arr.Length; int k = 2; sortArr(arr, n, k); } } //contributed by Arnab Kundu |
Javascript
<script> // Javascript implementation of the approach // Utility function to print // the contents of an array function printArr(arr, n) { for ( var i = 0; i < n; i++) document.write(arr[i] + " " ); } // Function to sort elements // in between multiples of k function sortArr(arr, n, k) { // To store the index of // previous multiple of k var prev = -1; for ( var i = 0; i < n; i++) { if (arr[i] % k == 0) { // If it is not the // first multiple of k if (prev != -1) var tmp = arr.slice(prev+1, i).sort((a,b)=> a-b); // Sort the elements in between // the previous and the current // multiple of k for ( var j=prev+1; j< i; j++) { arr[j] = tmp[j-prev-1]; } // Update previous to be current prev = i; } } // Print the updated array printArr(arr, n); } // Driver code var arr = [2, 1, 13, 3, 7, 8, 21, 13, 12]; var n = arr.length; var k = 2; sortArr(arr, n, k); </script> |
2 1 3 7 13 8 13 21 12