Insertion sort to sort even and odd positioned elements in different orders
We are given an array. We need to sort the even positioned elements in the ascending order and the odd positioned elements in the descending order. We must apply insertion sort to sort them.
Examples:
Input : a[] = {7, 10, 11, 3, 6, 9, 2, 13, 0}
Output : 11 3 7 9 6 10 2 13 0
Even positioned elements after sorting int
ascending order : 3 9 10 13
Odd positioned elements after sorting int
descending order : 11 7 6 2 0
We separately apply the insertion sort technique on the even positioned elements and the odd positioned elements separately but within the same array. The loop starts for the odd positioned from the 0th index(1st element) and the for the even from the 1st index(2nd element) and keep on increasing by 2 since every alternate is odd/even positioned.
We now simply apply the insertion sort procedure on the odd positioned and even positioned. the odd positioned elements are A[0, 2, 4, …] and even are A[1, 3, 5, 7..]. So they are considered as separate sub-arrays but within the same array.
Explanation for the odd positioned:
The 0th element already sorted. Now the 2nd element compared with the 0th and inserted and so on the (i+2)th element compared with the previous ones until the end of the array. The same approach is applied for the even positioned elements in
the array.(This is same as the insertion sort technique).
C++
#include<stdio.h>
#include<stdlib.h>
void evenOddInsertionSort( int arr[], int n)
{
for ( int i = 2; i < n; i++)
{
int j = i-2;
int temp = arr[i];
if ((i+1) & 1 == 1)
{
while (temp >= arr[j] && j >= 0)
{
arr[j+2] = arr[j];
j -= 2;
}
arr[j+2] = temp;
}
else {
while (temp <= arr[j] && j >= 0)
{
arr[j+2] = arr[j];
j -= 2;
}
arr[j+2] = temp;
}
}
}
void printArray( int arr[], int n)
{
for ( int i=0; i < n; i++)
printf ( "%d " , arr[i]);
printf ( "\n" );
}
int main()
{
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof (arr)/ sizeof (arr[0]);
evenOddInsertionSort(arr, n);
printArray(arr, n);
return 0;
}
|
Java
class GFG
{
static void evenOddInsertionSort( int arr[], int n)
{
for ( int i = 2 ; i < n; i++)
{
int j = i - 2 ;
int temp = arr[i];
if (((i + 1 ) & 1 ) == 1 )
{
while (j >= 0 && temp >= arr[j])
{
arr[j + 2 ] = arr[j];
j -= 2 ;
}
arr[j + 2 ] = temp;
}
else
{
while (j >= 0 && temp <= arr[j])
{
arr[j + 2 ] = arr[j];
j -= 2 ;
}
arr[j + 2 ] = temp;
}
}
}
static void printArray( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
{
System.out.printf( "%d " , arr[i]);
}
System.out.printf( "\n" );
}
public static void main(String[] args)
{
int arr[] = { 12 , 11 , 13 , 5 , 6 };
int n = arr.length;
evenOddInsertionSort(arr, n);
printArray(arr, n);
}
}
|
Python3
def evenOddInsertionSort(arr, n):
for i in range ( 2 , n):
j = i - 2
temp = arr[i]
if ((i + 1 ) & 1 = = 1 ) :
while (temp > = arr[j] and j > = 0 ):
arr[j + 2 ] = arr[j]
j - = 2
arr[j + 2 ] = temp
else :
while (temp < = arr[j] and j > = 0 ) :
arr[j + 2 ] = arr[j]
j - = 2
arr[j + 2 ] = temp
def printArray(arr, n):
for i in range ( 0 , n):
print (arr[i], end = " " )
arr = [ 12 , 11 , 13 , 5 , 6 ]
n = len (arr)
evenOddInsertionSort(arr, n)
printArray(arr, n)
|
C#
using System;
class GFG
{
static void evenOddInsertionSort( int []arr, int n)
{
for ( int i = 2; i < n; i++)
{
int j = i - 2;
int temp = arr[i];
if (((i + 1) & 1) == 1)
{
while (j >= 0 && temp >= arr[j])
{
arr[j + 2] = arr[j];
j -= 2;
}
arr[j + 2] = temp;
}
else
{
while (j >= 0 && temp <= arr[j])
{
arr[j + 2] = arr[j];
j -= 2;
}
arr[j + 2] = temp;
}
}
}
static void printArray( int []arr, int n)
{
for ( int i = 0; i < n; i++)
{
Console.Write( "{0} " , arr[i]);
}
Console.Write( "\n" );
}
public static void Main(String[] args)
{
int []arr = {12, 11, 13, 5, 6};
int n = arr.Length;
evenOddInsertionSort(arr, n);
printArray(arr, n);
}
}
|
Javascript
<script>
function evenOddInsertionSort(arr, n)
{
for (let i = 2; i < n; i++)
{
let j = i - 2;
let temp = arr[i];
if (((i + 1) & 1) == 1)
{
while (j >= 0 && temp >= arr[j])
{
arr[j + 2] = arr[j];
j -= 2;
}
arr[j + 2] = temp;
}
else
{
while (j >= 0 && temp <= arr[j])
{
arr[j + 2] = arr[j];
j -= 2;
}
arr[j + 2] = temp;
}
}
}
function printArray(arr, n)
{
for (let i = 0; i < n; i++)
{
document.write(arr[i] + " " );
}
document.write();
}
let arr = [12, 11, 13, 5, 6];
let n = arr.length;
evenOddInsertionSort(arr, n);
printArray(arr, n);
</script>
|
Output:
13 5 12 11 6
Time Complexity: O(n2)
Auxiliary Space: O(1)
There exist better approaches to solve this problem without insertion sort. Please refer Sort even-placed elements in increasing and odd-placed in decreasing order for details.
Last Updated :
07 Apr, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...