Quotient – Remainder Sort
Last Updated :
23 Jun, 2022
Quotient – Remainder Sort is a non-comparison based sorting algorithm. Steps to perform Quotient – Remainder sort as described below :
- Find MIN and MAX of the array.
- Create an ROW*COL matrix consisting of 0s, where ROW = MAX/MIN+1 and COL = MIN.
- For each element in the input array, calculate quotient and remainder and store in the matrix[quotient][remainder]
- For each element in matrix, if element != 0, append element to sorted array
Examples:
Input : 2 5 3 7 4 8
MAX = 8, MIN = 2, ROW = 4, COL 2
matrix : 2 3
4 5
0 7
8 0
Output : 2 3 4 5 7 8
C++
#include <algorithm>
#include <iostream>
using namespace std;
void QRsort( int arr[], int size)
{
int MAX = *max_element(arr, arr + size);
int MIN = *min_element(arr, arr + size);
cout << "Maximum Element found is : " << MAX << endl;
cout << "Minimum Element found is : " << MIN << endl;
int COL = MIN;
int ROW = MAX / MIN + 1;
int matrix[ROW][COL] = { 0 };
for ( int i = 0; i < size; i++) {
int quotient = arr[i] / MIN;
int remainder = arr[i] % MIN;
matrix[quotient][remainder + 1] = arr[i];
}
int k = 0;
for ( int i = 0; i < ROW; i++) {
for ( int j = 0; j < COL; j++) {
if (matrix[i][j] != 0) {
arr[k++] = matrix[i][j];
}
}
}
}
void printArray( int arr[], int size)
{
for ( int i = 0; i < size; i++)
cout << arr[i] << " " ;
cout << endl;
}
int main()
{
int arr[] = { 5, 3, 7, 4, 8, 2, 6 };
int size = sizeof (arr) / sizeof (arr[0]);
cout << "Initial Array : " << endl;
printArray(arr, size);
QRsort(arr, size);
cout << "Array after sorting : " << endl;
printArray(arr, size);
}
|
Java
import java.util.*;
class GFG
{
static void QRsort( int arr[], int size)
{
int MAX = Arrays.stream(arr).max().getAsInt();
int MIN = Arrays.stream(arr).min().getAsInt();
System.out.println( "Maximum Element found is : " + MAX);
System.out.println( "Minimum Element found is : " + MIN);
int COL = MIN;
int ROW = MAX / MIN + 1 ;
int [][] matrix = new int [ROW][COL];
for ( int i = 0 ; i < size; i++)
{
int quotient = arr[i] / MIN;
int remainder = arr[i] % MIN;
matrix[quotient][remainder] = arr[i];
}
int k = 0 ;
for ( int i = 0 ; i < ROW; i++)
{
for ( int j = 0 ; j < COL; j++)
{
if (matrix[i][j] != 0 )
{
arr[k++] = matrix[i][j];
}
}
}
}
static void printArray( int arr[], int size)
{
for ( int i = 0 ; i < size; i++)
{
System.out.print(arr[i] + " " );
}
System.out.println();
}
public static void main(String[] args)
{
int arr[] = { 5 , 3 , 7 , 4 , 8 , 2 , 6 };
int size = arr.length;
System.out.println( "Initial Array : " );
printArray(arr, size);
QRsort(arr, size);
System.out.println( "Array after sorting : " );
printArray(arr, size);
}
}
|
Python3
def QRsort(arr, size):
MAX = max (arr)
MIN = min (arr)
print ( "Maximum Element found is : {}" . format ( MAX ))
print ( "Minimum Element found is : {}" . format ( MIN ))
COL = MIN
ROW = ( MAX / / MIN ) + 1
matrix = [[ 0 for i in range (COL)] for j in range (ROW)]
for i in range (size):
quotient = arr[i] / / MIN
remainder = arr[i] % MIN
matrix[quotient][remainder] = arr[i]
k = 0
for i in range (ROW):
for j in range (COL):
if (matrix[i][j] ! = 0 ):
arr[k] = matrix[i][j]
k = k + 1
def printArray(arr, size):
for i in range (size):
print (arr[i], end = ' ' )
print ()
arr = [ 5 , 3 , 7 , 4 , 8 , 2 , 6 ]
size = len (arr)
print ( "Initial Array : " )
printArray(arr, size)
QRsort(arr, size)
print ( "Array after sorting : " )
printArray(arr, size)
|
C#
using System;
using System.Linq;
class GFG
{
static void QRsort( int []arr, int size)
{
int MAX = arr.Max();
int MIN = arr.Min();
Console.WriteLine( "Maximum Element found is : " + MAX);
Console.WriteLine( "Minimum Element found is : " + MIN);
int COL = MIN;
int ROW = MAX / MIN + 1;
int [,] matrix = new int [ROW, COL];
for ( int i = 0; i < size; i++)
{
int quotient = arr[i] / MIN;
int remainder = arr[i] % MIN;
matrix[quotient, remainder] = arr[i];
}
int k = 0;
for ( int i = 0; i < ROW; i++)
{
for ( int j = 0; j < COL; j++)
{
if (matrix[i, j] != 0)
{
arr[k++] = matrix[i, j];
}
}
}
}
static void printArray( int []arr, int size)
{
for ( int i = 0; i < size; i++)
{
Console.Write(arr[i] + " " );
}
Console.WriteLine();
}
public static void Main(String[] args)
{
int []arr = {5, 3, 7, 4, 8, 2, 6};
int size = arr.Length;
Console.WriteLine( "Initial Array : " );
printArray(arr, size);
QRsort(arr, size);
Console.WriteLine( "Array after sorting : " );
printArray(arr, size);
}
}
|
Javascript
<script>
function QRsort(arr , size)
{
var MAX = Math.max.apply( null , arr);
var MIN = Math.min.apply( null , arr);
document.write( "Maximum Element found is : " + MAX);
document.write( "<br>Minimum Element found is : " + MIN);
var COL = MIN;
var ROW = MAX / MIN + 1;
var matrix = Array(ROW).fill(0).map(x => Array(COL).fill(0));;
for ( var i = 0; i < size; i++)
{
var quotient = parseInt(arr[i] / MIN);
var remainder = arr[i] % MIN;
matrix[quotient][remainder] = arr[i];
}
var k = 0;
for ( var i = 0; i < ROW; i++)
{
for ( var j = 0; j < COL; j++)
{
if (matrix[i][j] != 0)
{
arr[k++] = matrix[i][j];
}
}
}
}
function printArray(arr , size)
{
for ( var i = 0; i < size; i++)
{
document.write(arr[i] + " " );
}
document.write( '<br>' );
}
var arr = [5, 3, 7, 4, 8, 2, 6];
var size = arr.length;
document.write( "Initial Array : " );
printArray(arr, size);
QRsort(arr, size);
document.write( "Array after sorting : <br>" );
printArray(arr, size);
</script>
|
Output:
Initial Array :
5 3 7 4 8 2 6
Maximum Element found is : 8
Minimum Element found is : 2
Array after sorting :
2 3 4 5 6 7 8
Time Complexity: O(r*c) where c = MIN and r = MAX/MIN where MAX and MIN are the maximum and minimum elements of the array respectively.
Auxiliary Space: O(r*c)
References
Abul Hasnat, Tanima Bhattacharyya, Atanu Dey, Santanu Halder, and Debotosh Bhattachajee, 2017. A Novel Sorting Algorithm using Quotient and Remainder,
J. Eng. Applied Sci, 12 (Special Issue 7): 8016-8020, 2017, ISSN : 1816-949X
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...