Sort only non-prime numbers of an array in increasing order
Given an array of N integers. The task is to print the sorted array such that all numbers that are prime stay in the same place, sort only the non prime numbers.
Examples:
Input : arr[] = {10, 7, 6}
Output : 6 7 10
Input : arr[] = {100, 11, 500, 2, 17, 1}
Output : 1 11 100 2 17 500
Approach:
- Traverse the array, take out all non-prime numbers and store them in a vector.
- Now, sort the vector.
- Then, traverse the array again and check if a number is prime, if yes then print it as it is. Otherwise, print a number from the vector.
To check whether a number is prime or not we can use sieve-of-eratosthenes.
Below is the implementation of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool prime[100005];
void SieveOfEratosthenes( int n)
{
memset (prime, true , sizeof (prime));
prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
}
void sortedArray( int arr[], int n)
{
SieveOfEratosthenes(100005);
std::vector< int > v;
for ( int i = 0; i < n; ++i) {
if (prime[arr[i]] == 0)
v.push_back(arr[i]);
}
sort(v.begin(), v.end());
int j = 0;
for ( int i = 0; i < n; ++i) {
if (prime[arr[i]] == true )
cout << arr[i] << " " ;
else {
cout << v[j] << " " ;
j++;
}
}
}
int main()
{
int n = 6;
int arr[] = { 100, 11, 500, 2, 17, 1 };
sortedArray(arr, n);
return 0;
}
|
Java
import java.util.*;
class solution
{
static boolean prime[] = new boolean [ 100006 ];
static void SieveOfEratosthenes( int n)
{
for ( int i= 1 ;i<=n;i++)
prime[i]= true ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * 2 ; i <= n; i += p)
prime[i] = false ;
}
}
}
static void sortedArray( int arr[], int n)
{
SieveOfEratosthenes( 100005 );
Vector<Integer> v = new Vector<Integer>();
for ( int i = 0 ; i < n; ++i) {
if (prime[arr[i]]== false )
v.add(arr[i]);
}
Collections.sort(v);
int j = 0 ;
for ( int i = 0 ; i < n; ++i) {
if (prime[arr[i]] == true )
System.out.print( arr[i] + " " );
else {
System.out.print( v.get(j) + " " );
j++;
}
}
}
public static void main(String args[])
{
int n = 6 ;
int arr[] = { 100 , 11 , 500 , 2 , 17 , 1 };
sortedArray(arr, n);
}
}
|
Python3
from math import sqrt
prime = [ 0 ] * 100005
def SieveOfEratosthenes(n) :
for i in range ( len (prime)) :
prime[i] = True
prime[ 1 ] = False
for p in range ( 2 , int (sqrt(n)) + 1 ) :
if prime[p] = = True :
for i in range (p * 2 , n, p) :
prime[i] = False
def sortedArray(arr, n) :
SieveOfEratosthenes( 100005 )
v = []
for i in range (n) :
if prime[arr[i]] = = 0 :
v.append(arr[i])
v.sort()
j = 0
for i in range (n) :
if prime[arr[i]] = = True :
print (arr[i],end = " " )
else :
print (v[j],end = " " )
j + = 1
if __name__ = = "__main__" :
n = 6
arr = [ 100 , 11 , 500 , 2 , 17 , 1 ]
sortedArray(arr, n)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static bool []prime = new bool [100006];
static void SieveOfEratosthenes( int n)
{
for ( int i = 1; i <= n; i++)
prime[i] = true ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
}
static void sortedArray( int []arr, int n)
{
SieveOfEratosthenes(100005);
List< int > v = new List< int >();
for ( int i = 0; i < n; ++i)
{
if (prime[arr[i]] == false )
v.Add(arr[i]);
}
v.Sort();
int j = 0;
for ( int i = 0; i < n; ++i)
{
if (prime[arr[i]] == true )
Console.Write( arr[i] + " " );
else
{
Console.Write( v[j] + " " );
j++;
}
}
}
public static void Main()
{
int n = 6;
int []arr = { 100, 11, 500, 2, 17, 1 };
sortedArray(arr, n);
}
}
|
Javascript
<script>
prime = new Array(100005);
function SieveOfEratosthenes( n)
{
prime.fill( true );
prime[1] = false ;
for ( var p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( var i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
}
function sortedArray(arr, n)
{
SieveOfEratosthenes(100005);
var v = [];
for ( var i = 0; i < n; ++i) {
if (prime[arr[i]] == 0)
v.push(arr[i]);
}
v.sort();
var j = 0;
for ( var i = 0; i < n; ++i) {
if (prime[arr[i]] == true )
document.write( arr[i] + " " );
else {
document.write( v[j] + " " );
j++;
}
}
}
var n = 6;
var arr = [ 100, 11, 500, 2, 17, 1 ];
sortedArray(arr, n);
</script>
|
Time Complexity:
Last Updated :
06 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...