Quotient – Remainder Sort es un algoritmo de clasificación que no se basa en la comparación. Pasos para realizar la clasificación Cociente – Resto como se describe a continuación:
- Encuentre MIN y MAX de la array.
- Cree una array ROW*COL que consta de 0, donde ROW = MAX/MIN+1 y COL = MIN.
- Para cada elemento en la array de entrada, calcule el cociente y el resto y guárdelo en la array[cociente][resto]
- Para cada elemento en la array, si el elemento! = 0, agregue el elemento a la array ordenada
Ejemplos:
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++
// CPP program to implement Quotient - Remainder // Sort #include <algorithm> #include <iostream> using namespace std; void QRsort(int arr[], int size) { // max_element finds maximum element in an array int MAX = *max_element(arr, arr + size); // min_element finds minimum element in an array 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; // Creating a ROW * COL matrix of all zeros 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
// Java program to implement // Quotient - Remainder Sort import java.util.*; class GFG { static void QRsort(int arr[], int size) { // max_element finds maximum element in an array int MAX = Arrays.stream(arr).max().getAsInt(); // min_element finds minimum element in an array 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; // Creating a ROW * COL matrix of all zeros 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(); } // Driver Code 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); } } // This code is contributed by Princi Singh
Python3
# Python program to implement Quotient - Remainder # Sort def QRsort(arr, size): # max_element finds maximum element in an array MAX = max(arr) # min_element finds minimum element in an array MIN = min(arr) print("Maximum Element found is : {}".format(MAX)) print("Minimum Element found is : {}".format(MIN)) COL = MIN ROW = (MAX//MIN) + 1 # Creating a ROW * COL matrix of all zeros 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() # Driver Code 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) # This code is contributed by Pushpesh Raj
C#
// C# program to implement // Quotient - Remainder Sort using System; using System.Linq; class GFG { static void QRsort(int []arr, int size) { // max_element finds maximum element in an array int MAX = arr.Max(); // min_element finds minimum element in an array 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; // Creating a ROW * COL matrix of all zeros 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(); } // Driver Code 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); } } // This code is contributed by Rajput-Ji
Javascript
<script> // javascript program to implement // Quotient - Remainder Sort function QRsort(arr , size) { // max_element finds maximum element in an array var MAX = Math.max.apply(null, arr); // min_element finds minimum element in an array 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; // Creating a ROW * COL matrix of all zeros 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>'); } // Driver Code 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); // This code is contributed by shikhasingrajput </script>
Producción:
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
Complejidad de tiempo : O(r*c) donde c = MIN y r = MAX/MIN donde MAX y MIN son los elementos máximo y mínimo de la array respectivamente.
Espacio Auxiliar : O(r*c)
Referencias
Abul Hasnat, Tanima Bhattacharyya, Atanu Dey, Santanu Halder y Debotosh Bhattachajee, 2017. A Novel Sorting Algorithm using Quotient and Remainder,
J. Eng. Applied Sci, 12 (número especial 7): 8016-8020, 2017, ISSN: 1816-949X