// 5.cpp
#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*[col]; // asignando espacio para el arreglo de direccines
for (int j=0; j<col; ++j)
matriz[j] = new int[fil]; // asignando espacio para cada columna e inicializando el arreglo de direcciones
inicializar_matriz(matriz, fil, col);
mostrar_matriz(matriz, fil, col);
for (int j=0; j<col; ++j) {
ordenamiento_rapido(matriz[j], 0, fil-1);
}
cout<<"Matriz de notas con las columnas ordenadas:\n";
mostrar_matriz(matriz, fil, col);
for (int j=0; j<col; ++j)
delete[] matriz[j]; // liberando espacio asignado para cada columna
delete[] matriz;
}
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<columnas; ++j)
for (int k=0; k<filas; ++k)
p[j][k] = rand()%21;
}
void mostrar_matriz(int **p, int filas, int columnas) {
for (int j=0; j<filas; ++j) {
for (int k=0; k<columnas; ++k)
cout<<setw(4)<<p[k][j];
cout<<endl;
}
cout<<endl;
}