#include<iostream>
#include<iomanip>
using namespace std;
void ordenamiento_rapido(int* arr, int i_ini, int i_fin);
int separar(int* arr, int i_ini, int i_fin);
void inicializar_matriz(int **p, int filas, int columnas);
void mostrar_matriz(int **p, int filas, int columnas);
int main() {
int fil = 0, col = 0;
srand(time(nullptr));
cout << "filas\t\t\t: "; cin >> fil;
cout << "columnas\t\t: "; cin >> col;
int** matriz = new int*[fil]; // asignando espacio para el arreglo de direccines
matriz[0] = new int[fil*col]; // asignando espacio para la matriz de enteros
for (int j = 1; j < fil; ++j) // inicializando el arreglo de direcciones
matriz[j] = matriz[0] + j*col;
inicializar_matriz(matriz, fil, col);
cout << endl;
mostrar_matriz(matriz, fil, col);
ordenamiento_rapido(matriz[0], 0, fil*col-1);
mostrar_matriz(matriz, fil, col);
delete[] matriz[0]; // liberando espacio asignado para la matriz de enteros
matriz[0] = nullptr;
delete[] matriz; // liberando espacio asignado para la matriz de direcciones
matriz = nullptr;
}
void ordenamiento_rapido(int* arr, int i_ini, int i_fin) {
if (i_ini < i_fin) {
int i_pivote = separar(arr, i_ini, i_fin);
ordenamiento_rapido(arr, i_ini, i_pivote - 1);
ordenamiento_rapido(arr, i_pivote + 1, i_fin);
}
}
int separar(int* arr, int i_ini, int i_fin) {
int pivote = arr[i_fin];
int i_aux = i_ini;
int aux; //variable auxiliar para hacer los intercambios
for (int j = i_ini; j < i_fin; ++j) {
if (arr[j] < pivote) {
aux = arr[i_aux];
arr[i_aux] = arr[j];
arr[j] = aux;
++i_aux;
}
}
aux = arr[i_aux];
arr[i_aux] = arr[i_fin];
arr[i_fin] = aux;
return i_aux;//retornando el indice del pivote
}
void inicializar_matriz(int **p, int filas, int columnas) {
for (int j = 0; j < filas; ++j)
for (int k = 0; k < columnas; ++k)
p[j][k] = rand()%21;
}
void mostrar_matriz(int **p, int filas, int columnas) {
for (int j = 0; j < filas; ++j) {
cout << "Fila " << j << ":";
for (int k = 0; k < columnas; ++k)
cout << setw(4) << p[j][k];
cout << endl;
}
cout << endl;
}