En lenguaje C, si desea utilizar una función operada por el sistema como qsort para ordenar una fila de una matriz bidimensional, ¿cómo se hace?
qsort es la función de clasificación rápida incorporada en la biblioteca del compilador. Su prototipo es:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
Parámetros El significado es el siguiente:
base: la primera dirección de la matriz a ordenar.
Num: El número de elementos de la matriz que se van a ordenar.
ancho: El tamaño del espacio que ocupa cada elemento.
Comparación: puntero de función utilizado para determinar el orden de clasificación.
Lo que es más difícil de entender es el puntero de función de comparación, que determina cómo ordenar. Modificando el cuerpo de la función al que apunta el puntero de función, se pueden ordenar tipos complejos (como estructuras). Además, puede cambiar el método de clasificación, como orden ascendente o descendente.
Para lograr el efecto en la pregunta, debe pasar la primera dirección de la fila donde se encuentran los datos en el primer parámetro, el segundo parámetro pasa el número de elementos en una fila y el tercero La fila pasa la dirección de cada elemento. La cuarta línea pasa un puntero de función de comparación personalizada (nombre de la función).
Lo siguiente toma una matriz de enteros a[3][4] con 3 filas y 4 columnas como ejemplo, y ordena su segunda fila (a[1]) en orden ascendente para escribir código que sea útil. para entender. #include?
#include?
int?cmp(const?void?*a,?const?void?*b)
{
return?*(( int?*)a)? >?*((int?*)b);// Debido a que es una matriz de números enteros, el puntero necesita para convertirlo como un puntero entero, luego obtener el valor y comparar.
}
int?main()
{
int?a[3][4] =?
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};// Se puede ver que la matriz definida originalmente está desordenada.
int?i,j;
qsort(a[1],?4,?sizeof(int),?cmp);
El siguiente código generará los valores de los elementos de la matriz para verificar los resultados de la clasificación.
for(i?=?0;?i?3;?i?++)
{
for(j?=?0 ;?j?4;?j?++)
printf("%3d",a[i][j]);
printf("\n" );
}
return?;
}
Salida después de ejecutar el programa:?5?1?54?6 12 ?22?32?44 34?5?2?1
Puede ver que la segunda fila se ha ordenado en orden ascendente, mientras que las otras dos filas no han cambiado.