Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmSort perfect squares in an array at their relative positions

Sort perfect squares in an array at their relative positions

Given an integer array arr  , the task is to sort only the elements which are perfect squares at their relative positions in the array (positions of other elements must not be affected).

Examples: 

Input: arr[] = {2, 64, 9, 8, 1, 4} 
Output: 2 1 4 8 9 64 
1, 4, 9 and 64 are the only perfect squares from the array.

Input: arr[] = {1, 49, 2, 36} 
Output: 1 36 2 49 

Approach: 

  • Initialize two empty vectors and traverse the array from left to right.
  • Take an integer and a float variable and for every element of the array store it’s square root in both of these variables.
  • If both the variables are equal then push the index of this element in the first vector and push the element itself in the second vector.
  • Sort the second vector.
  • Now, we have the index of all the required elements in the first vector and also all of the required elements in sorted order in the second vector.
  • So, insert the elements of the second vector into the array at the indices present in the first vector one by one.

Below is the implementation of the above approach: 

C++




// C++ program to sort all the elements that are
// perfect squares in their relative positions
#include <bits/stdc++.h>
using namespace std;
 
// function to sort all the elements that are
// perfect squares in their relative positions
void sortPerfectSquare(int arr[], int n)
{
    int a;
    float b;
 
    // v1 will contain index of perfect squares
    // v2 will contain each perfect square
    vector<int> v1;
    vector<int> v2;
 
    for (int i = 0; i < n; i++) {
        b = sqrt(arr[i]);
        a = b;
 
        // if both a and b are equal then
        // arr[i] is a perfect square
        if (a == b) {
            v1.push_back(i);
            v2.push_back(arr[i]);
        }
    }
 
    // sort second vector
    sort(v2.begin(), v2.end());
 
    // put the sorted perfect square
    // back into the array
    int j = 0;
    for (int i = 0; i < n; i++) {
        if (v1[j] == i) {
            arr[i] = v2[j];
            j++;
        }
    }
 
    // print final array
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
}
 
// Driver code
int main()
{
    int arr[] = { 9, 44, 100, 81, 21, 64 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    sortPerfectSquare(arr, n);
 
    return 0;
}


Java




// Java program to sort all the elements that are
// perfect squares in their relative positions
import java.util.*;
 
class GFG
{
 
// function to sort all the elements that are
// perfect squares in their relative positions
static void sortPerfectSquare(int arr[], int n)
{
    int a;
    float b;
 
    // v1 will contain index of perfect squares
    // v2 will contain each perfect square
    Vector<Integer> v1 = new Vector<Integer>();
    Vector<Integer> v2 = new Vector<Integer>();
 
    for (int i = 0; i < n; i++)
    {
        b = (float) Math.sqrt(arr[i]);
        a = (int) b;
 
        // if both a and b are equal then
        // arr[i] is a perfect square
        if (a == b)
        {
            v1.add(i);
            v2.add(arr[i]);
        }
    }
 
    // sort second vector
    Collections.sort(v2);
 
    // put the sorted perfect square
    // back into the array
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        if (v1.get(j) == i)
        {
            arr[i] = v2.get(j);
            j++;
        }
    }
 
    // print final array
    for (int i = 0; i < n; i++)
            System.out.print(arr[i]+" ");
}
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 9, 44, 100, 81, 21, 64 };
        int n = arr.length;
 
        sortPerfectSquare(arr, n);
    }
}
 
// This code is contributed by 29AjayKumar


Python3




# Python 3 program to sort all
# the elements that are perfect
# squares in their relative positions
 
# import sqrt() from math lib
from math import sqrt
 
# function to sort all the elements
# that are perfect squares in their
# relative positions
def sortPerfectSquare(arr, n) :
     
    # v1 will contain index of
    # perfect squares and v2 will
    # contain each perfect square
    v1 = []
    v2 = []
     
    for i in range(n):
        b = sqrt(arr[i])
        a = int(b)
         
        # if both a and b are equal then
        # arr[i] is a perfect square
        if a == b :
            v1.append(i)
            v2.append(arr[i])
     
    # sort second list
    v2.sort()
     
    j = 0
     
    # put the sorted perfect square
    # back into the array
    for i in range(n) :
        if v1[j] == i :
            arr[i] = v2[j]
            j += 1
     
    # print final array
    for i in range(n) :
        print(arr[i], end = " ")
         
# Driver code
if __name__ == "__main__" :
    arr = [9, 44, 100, 81, 21, 64]
    n = len(arr)
     
    sortPerfectSquare(arr, n);
 
# This code is contributed by ANKITRAI1


C#




// C# program to sort all the elements that are
// perfect squares in their relative positions
using System;
using System.Collections.Generic;
 
class GFG
{
 
// function to sort all the elements that are
// perfect squares in their relative positions
static void sortPerfectSquare(int []arr, int n)
{
    int a;
    float b;
 
    // v1 will contain index of perfect squares
    // v2 will contain each perfect square
    List<int> v1 = new List<int>();
    List<int>v2 = new List<int>();
 
    for (int i = 0; i < n; i++)
    {
        b = (float) Math.Sqrt(arr[i]);
        a = (int) b;
 
        // if both a and b are equal then
        // arr[i] is a perfect square
        if (a == b)
        {
            v1.Add(i);
            v2.Add(arr[i]);
        }
    }
 
    // sort second vector
    v2.Sort();
 
    // put the sorted perfect square
    // back into the array
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        if (v1[j] == i)
        {
            arr[i] = v2[j];
            j++;
        }
    }
 
    // print final array
    for (int i = 0; i < n; i++)
            Console.Write(arr[i] + " ");
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 9, 44, 100, 81, 21, 64 };
    int n = arr.Length;
 
    sortPerfectSquare(arr, n);
}
}
 
// This code is contributed by
// PrinciRaj1992


PHP




<?php
// PHP program to sort all the elements that are
// perfect squares in their relative positions
 
// function to sort all the elements that are
// perfect squares in their relative positions
function sortPerfectSquare($arr, $n)
{
    // v1 will contain index of perfect squares
    // v2 will contain each perfect square
    $v1 = array();
    $v2 = array();
 
    for ( $i = 0; $i < $n; $i++)
    {
        $b = sqrt($arr[$i]);
        $a = (int)$b;
 
        // if both a and b are equal then
        // arr[i] is a perfect square
        if ($a == $b)
        {
            array_push($v1, $i);
            array_push($v2, $arr[$i]);
        }
    }
 
    // sort second vector
    sort($v2);
 
    // put the sorted perfect square
    // back into the array
    $j = 0;
    for ( $i = 0; $i < $n; $i++)
    {
        if ($v1[$j] == $i)
        {
            $arr[$i] = $v2[$j];
            $j++;
        }
    }
 
    // print final array
    for ($i = 0; $i < $n; $i++)
        echo $arr[$i] . " ";
}
 
// Driver Code
$arr = array( 9, 44, 100, 81, 21, 64 );
$n = count($arr);
sortPerfectSquare($arr, $n);
 
// This code is contributed by Rajput-Ji
?>


Javascript




<script>
 
// Javascript program to sort all the elements that are
// perfect squares in their relative positions
 
// function to sort all the elements that are
// perfect squares in their relative positions
function sortPerfectSquare(arr, n)
{
    var a;
    var b;
 
    // v1 will contain index of perfect squares
    // v2 will contain each perfect square
    var v1 = [];
    var v2 = [];
 
    for (var i = 0; i < n; i++) {
        b = Math.sqrt(arr[i]);
        a = parseInt(b);
 
        // if both a and b are equal then
        // arr[i] is a perfect square
        if (a == b) {
            v1.push(i);
            v2.push(arr[i]);
        }
    }
 
    // sort second vector
    v2.sort((a,b) => a-b)
 
    // put the sorted perfect square
    // back into the array
    var j = 0;
    for (var i = 0; i < n; i++) {
        if (v1[j] == i) {
            arr[i] = v2[j];
            j++;
        }
    }
 
    // print final array
    for (var i = 0; i < n; i++)
        document.write( arr[i] + " ");
}
 
// Driver code
var arr = [9, 44, 100, 81, 21, 64 ];
var n = arr.length;
sortPerfectSquare(arr, n);
 
</script>


Output

9 44 64 81 21 100 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Shaida Kate Naidoo
am passionate about learning the latest technologies available to developers in either a Front End or Back End capacity. I enjoy creating applications that are well designed and responsive, in addition to being user friendly. I thrive in fast paced environments. With a diverse educational and work experience background, I excel at collaborating with teams both local and international. A versatile developer with interests in Software Development and Software Engineering. I consider myself to be adaptable and a self motivated learner. I am interested in new programming technologies, and continuous self improvement.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments