Open In App

Sort an array after applying the given equation

Improve
Improve
Like Article
Like
Save
Share
Report

We have an integer array that is sorted in ascending order. We also have 3 integers A, B and C. We need to apply A*x*x + B*x + C for each element x in the array and sort the modified array. 

Example: 

Input : arr[] = {-1, 0, 1, 2, 3, 4} 
A = -1, B = 2, C = -1
Output : {-9, -4, -4, -1, -1, 0}
Expalnation:
Input array is {-1, 0, 1, 2, 3, 4}. After
applying the equation A*x*x + B*x + C on
every element x we get, {-4,-1, 0, -1, -4, -9}
After sorting, we get {-9, -4, -4, -1, -1, 0}

Method 1 (Simple) : 

  • Apply the given equation to all the elements. O(n) 
  • Sort the modified array. O(n log n)

Steps:

  • Initialize an array arr of size n with given elements.
  • Initialize three integers A, B, and C.
  • For each element x in arr, apply the given equation Axx + B*x + C and store the result in arr.
  • Sort the array arr using a sorting algorithm.
  • Print the sorted array arr.

Below is the implementation of the approach:

C++




// C++ code for the approach
 
#include<bits/stdc++.h>
using namespace std;
 
// Function to apply the given equation on each element of the array
void applyEquation(int arr[], int n, int a, int b, int c) {
      // traversing array and updating each value
      // as per equation
    for(int i=0; i<n; i++) {
        arr[i] = a*arr[i]*arr[i] + b*arr[i] + c;
    }
}
 
// Driver's code
int main() {
      // Input array
    int arr[] = { -21 ,-15, 12, 13, 14 };
    int n = sizeof(arr)/sizeof(arr[0]);
 
    int a = -6, b = -7, c = 2;
 
    // Funciton call
    applyEquation(arr, n, a, b, c);
 
    // Sorting the modified array
    sort(arr, arr+n);
 
    // Printing the sorted array
      cout << "Array after sorting is : ";
    for(int i=0; i<n; i++) {
        cout << arr[i] << " ";
    }
 
    return 0;
}


Java




import java.util.Arrays;
 
public class ArrayEquation {
    // Function to apply the given equation on each element of the array
    public static void applyEquation(int[] arr, int n, int a, int b, int c) {
        // Traversing the array and updating each value as per the equation
        for (int i = 0; i < n; i++) {
            arr[i] = a * arr[i] * arr[i] + b * arr[i] + c;
        }
    }
 
    // Driver's code
    public static void main(String[] args) {
        // Input array
        int[] arr = { -21, -15, 12, 13, 14 };
        int n = arr.length;
 
        int a = -6, b = -7, c = 2;
 
        // Function call
        applyEquation(arr, n, a, b, c);
 
        // Sorting the modified array
        Arrays.sort(arr);
 
        // Printing the sorted array
        System.out.print("Array after sorting is: ");
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}


C#




using System;
 
public class ArrayEquation
{
    // Function to apply the given equation on each element of the array
    public static void ApplyEquation(int[] arr, int n, int a, int b, int c)
    {
        // Traversing the array and updating each value as per the equation
        for (int i = 0; i < n; i++)
        {
            arr[i] = a * arr[i] * arr[i] + b * arr[i] + c;
        }
    }
 
    // Driver's code
    public static void Main(string[] args)
    {
        // Input array
        int[] arr = { -21, -15, 12, 13, 14 };
        int n = arr.Length;
 
        int a = -6, b = -7, c = 2;
 
        // Function call
        ApplyEquation(arr, n, a, b, c);
 
        // Sorting the modified array
        Array.Sort(arr);
 
        // Printing the sorted array
        Console.Write("Array after sorting is: ");
        foreach (int num in arr)
        {
            Console.Write(num + " ");
        }
    }
}


Javascript




function applyEquation(arr, a, b, c) {
    // Traversing the array and updating each value as per the equation
    for (let i = 0; i < arr.length; i++) {
        arr[i] = a * arr[i] * arr[i] + b * arr[i] + c;
    }
}
 
// Driver's code
function main() {
    // Input array
    const arr = [-21, -15, 12, 13, 14];
    const a = -6, b = -7, c = 2;
 
    // Function call
    applyEquation(arr, a, b, c);
 
    // Sorting the modified array
    arr.sort((x, y) => x - y);
 
    // Printing the sorted array
    console.log("Array after sorting is: " + arr.join(" "));
}
 
main();


Python3




# Function to apply the given equation on each element of the array
def applyEquation(arr, n, a, b, c):
    # Traversing array and updating each value as per equation
    for i in range(n):
        arr[i] = a * arr[i] * arr[i] + b * arr[i] + c
 
# Driver's code
if __name__ == '__main__':
    # Input array
    arr = [-21, -15, 12, 13, 14]
    n = len(arr)
 
    a = -6
    b = -7
    c = 2
 
    # Function call
    applyEquation(arr, n, a, b, c)
 
    # Sorting the modified array
    arr.sort()
 
    # Printing the sorted array
    print("Array after sorting is:", arr)


Output

Array after sorting is : -2497 -1272 -1243 -1103 -946 


Time Complexity: O(n * log2n) as sort function has been called. Here, n is the size of the input array.
Auxiliary Space: O(1) as no extra space has been used.

Method 2(Efficient): Parabolic Property:

The equation given is parabolic. So the result of applying it to a sorted array will result in an array that will have a maximum/minimum with the sub-arrays to its left and right sorted.
In the above example, maximum is 0 and the subarray to its left {-4, -1} is sorted in ascending order and the sub-array to its right {-1, -4, -9} is sorted in descending order. 
All we need to do is merge these sorted arrays which are linear in time.

So the algorithm is: 

  • Apply equation on each element.
  • Find maximum/minimum.
  • Merge sub-arrays.

Note: The below code assumes that the modified array is first increasing then decreasing. 

Implementation:

C++




// C program to sort an array after applying equation
// A*x*x + B*x + C
#include<bits/stdc++.h>
using namespace std;
 
// Function to sort an array after applying given
// equation.
void sortArray(int arr[], int n, int A, int B, int C)
{
   // Apply equation on all elements
    for (int i = 0; i < n; i++)
        arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
 
    // Find maximum element in resultant array
    int index, maximum = INT_MIN;
    for (int i = 0; i< n; i++)
    {
        if (maximum < arr[i])
        {
            index = i;
            maximum = arr[i];
        }
    }
 
    // Use maximum element as a break point
    // and merge both subarrays using simple
    // merge function of merge sort
    int i = 0, j = n-1;
    int new_arr[n], k = 0;
    while (i < index && j > index)
    {
        if (arr[i] < arr[j])
            new_arr[k++] = arr[i++];
        else
            new_arr[k++] = arr[j--];
    }
 
    // Merge remaining elements
    while (i < index)
        new_arr[k++] = arr[i++];
    while (j > index)
        new_arr[k++] = arr[j--];
 
    new_arr[n-1] = maximum;
 
    // Modify original array
    for (int i = 0; i < n ; i++)
        arr[i] = new_arr[i];
}
 
// Driver code
int main()
{
    int arr[] = {-21 ,-15, 12, 13, 14 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int A = -6, B =-7, C = 2;
 
    sortArray(arr, n, A, B, C);
 
    cout << "Array after sorting is : ";
    for (int i=0; i<n; i++)
       cout << arr[i] << " ";
 
    return 0;
}


Java




// Java program to sort an array after applying equation
// A*x*x + B*x + C
 
class Main
{
    // Function to sort an array after applying given
    // equation.
    static void sortArray(int arr[], int n, int A, int B, int C)
    {
       // Apply equation on all elements
        for (int i = 0; i < n; i++)
            arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
      
        // Find maximum element in resultant array
        int index=-1;
        int maximum = -999999;
        for (int i = 0; i< n; i++)
        {
            if (maximum < arr[i])
            {
                index = i;
                maximum = arr[i];
            }
        }
      
        // Use maximum element as a break point
        // and merge both subarrays using simple
        // merge function of merge sort
        int i = 0, j = n-1;
        int[] new_arr = new int[n];
        int k = 0;
        while (i < index && j > index)
        {
            if (arr[i] < arr[j])
                new_arr[k++] = arr[i++];
            else
                new_arr[k++] = arr[j--];
        }
      
        // Merge remaining elements
        while (i < index)
            new_arr[k++] = arr[i++];
        while (j > index)
            new_arr[k++] = arr[j--];
      
        new_arr[n-1] = maximum;
      
        // Modify original array
        for (int p = 0; p < n ; p++)
            arr[p] = new_arr[p];
    }
     
    // main function
    public static void main (String[] args)
    {
        int arr[] = {-21 ,-15, 12, 13, 14 };
        int n = arr.length;
        int A = -6, B =-7, C = 2;
      
        sortArray(arr, n, A, B, C);
      
        System.out.println("Array after sorting is : ");
        for (int i=0; i<n; i++)
           System.out.print(arr[i]+" ");
    }
}
 
/* This code is contributed by Harsh Agarwal */


C#




// C# program to sort an array after applying equation
// A*x*x + B*x + C
  
using System;
class MAIN
{
    // Function to sort an array after applying given
    // equation.
    static void sortArray(int[] arr, int n, int A, int B, int C)
    {
       // Apply equation on all elements
        for (int i = 0; i < n; i++)
            arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
        
        // Find maximum element in resultant array
        int index=-1;
        int maximum = -999999;
        for (int i = 0; i< n; i++)
        {
            if (maximum < arr[i])
            {
                index = i;
                maximum = arr[i];
            }
        }
        
        // Use maximum element as a break point
        // and merge both subarrays using simple
        // merge function of merge sort
        int l = 0, j = n-1;
        int[] new_arr = new int[n];
        int k = 0;
        while (l < index && j > index)
        {
            if (arr[l] < arr[j])
                new_arr[k++] = arr[l++];
            else
                new_arr[k++] = arr[j--];
        }
        
        // Merge remaining elements
        while (l < index)
            new_arr[k++] = arr[l++];
        while (j > index)
            new_arr[k++] = arr[j--];
        
        new_arr[n-1] = maximum;
        
        // Modify original array
        for (int p = 0; p < n ; p++)
            arr[p] = new_arr[p];
    }
       
    // main function
    public static void Main () 
    {
        int[] arr = {-21 ,-15, 12, 13, 14 };
        int n = arr.Length;
        int A = -6, B =-7, C = 2;
        
        sortArray(arr, n, A, B, C);
        
        Console.Write("Array after sorting is : "+"\n");
        for (int i=0; i<n; i++)
           Console.Write(arr[i]+" ");
    }
}


Javascript




<script>
     
    function sortArray(arr,n,A,B,C)
    {
        // Apply equation on all elements
        for (let i = 0; i < n; i++)
            arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
        
        // Find maximum element in resultant array
        let index=-1;
        let maximum = -999999;
        for (let i = 0; i< n; i++)
        {
            if (maximum < arr[i])
            {
                index = i;
                maximum = arr[i];
            }
        }
        
        // Use maximum element as a break point
        // and merge both subarrays using simple
        // merge function of merge sort
        let i = 0, j = n-1;
        let new_arr = new Array(n);
        for(let i=0;i<n;i++)
        {
            new_arr[i]=0;
        }
        let k = 0;
        while (i < index && j > index)
        {
            if (arr[i] < arr[j])
                new_arr[k++] = arr[i++];
            else
                new_arr[k++] = arr[j--];
        }
        
        // Merge remaining elements
        while (i < index)
            new_arr[k++] = arr[i++];
        while (j > index)
            new_arr[k++] = arr[j--];
        
        new_arr[n-1] = maximum;
        
        // Modify original array
        for (let p = 0; p < n ; p++)
            arr[p] = new_arr[p];
    }
     
    let arr=[-21 ,-15, 12, 13, 14];
    let n = arr.length;
    let A = -6, B =-7, C = 2;
    sortArray(arr, n, A, B, C);
        
    document.write("Array after sorting is : <br>");
    for (let i=0; i<n; i++)
        document.write(arr[i]+" ");
     
     
     
    // This code is contributed by avanitrachhadiya2155
</script>


PHP




<?php
// PHP program to sort an array after
// applying equation A*x*x + B*x + C
 
// Function to sort an array after
// applying given   equation.
function sortArray(&$arr, $n, $A, $B, $C)
{
     
    // Apply equation on all elements
    for ($i = 0; $i < $n; $i++)
        $arr[$i] = $A * $arr[$i] * $arr[$i] +
                   $B * $arr[$i] + $C;
 
    // Find maximum element in
    // resultant array
    $index = 0;
    $maximum = PHP_INT_MIN;
    for ($i = 0; $i < $n; $i++)
    {
        if ($maximum < $arr[$i])
        {
            $index = $i;
            $maximum = $arr[$i];
        }
    }
 
    // Use maximum element as a break point
    // and merge both subarrays using simple
    // merge function of merge sort
    $i = 0;
    $j = $n - 1;
    $new_arr = array();
    while ($i < $index && $j > $index)
    {
        if ($arr[$i] < $arr[$j])
            array_push($new_arr, $arr[$i++]);
        else
            array_push($new_arr, $arr[$j--]);
    }
 
    // Merge remaining elements
    while ($i < $index)
        array_push($new_arr, $arr[$i++]);
    while ($j > $index)
        array_push($new_arr, $arr[$j--]);
 
    array_push($new_arr, $maximum);
 
    // Modify original array
    for ($i = 0; $i < count($new_arr) ; $i++)
        $arr[$i] = $new_arr[$i];
}
 
// Driver code
$arr = array(-21 ,-15, 12, 13, 14 );
$n = count($arr);
$A = -6;
$B = -7;
$C = 2;
 
sortArray($arr, $n, $A, $B, $C);
 
echo "Array after sorting is : \n";
for ($i = 0; $i < $n; $i++)
    echo $arr[$i] . " ";
 
// This code is contributed by mits
?>


Python3




# Python3 program to sort an
# array after applying equation
# A*x*x + B*x + C
import sys
 
# Function to sort an array
# after applying given equation.
def sortArray(arr, n, A, B, C):
 
    # Apply equation on all elements
    for i in range(n):
        arr[i] = (A * arr[i] * arr[i] +
                  B * arr[i] + C)
    index = -(sys.maxsize - 1)
    maximum = -(sys.maxsize - 1)
     
    # Find maximum element in
    # resultant array
    for i in range(n):
        if maximum < arr[i]:
            index = i
            maximum = arr[i]
     
    # Use maximum element as a break point
    # and merge both subarrays using simple
    # merge function of merge sort
    i = 0; j = n - 1;
    new_arr = [0] * n
    k = 0
    while i < index and j > index:
        if arr[i] < arr[j]:
            new_arr[k] = arr[i]
            k += 1
            i += 1
        else:
            new_arr[k] = arr[j]
            k += 1
            j -= 1
 
    # Merge remaining elements
    while i < index:
        new_arr[k] = arr[i]
        k += 1
        i += 1
 
    # Modify original array
    while j > index:
        new_arr[k] = arr[j]
        k += 1
        j -= 1
        new_arr[n - 1] = maximum
 
    for i in range(n):
        arr[i] = new_arr[i]
 
# Driver code
arr = [-21, -15, 12, 13, 14]
n = len(arr)
A = -6
B= -7
C = 2
sortArray(arr, n, A, B, C)
print("Array after sorting is:")
for i in range(n):
    print(arr[i], end = " ")
 
# This code is contributed
# by Shrikant13


Output

Array after sorting is : n-2497 -1272 -1243 -1103 -946 


Time Complexity: O(n) 
Auxiliary Space: O(n)



Last Updated : 11 Mar, 2024
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads