Ah ma voi parlavate del qsort predefinito del C? Io pensavo dovessi scrivere tu la funzione... comunque qui ho la mia soluzione adattata al tuo caso, è un po' rozza perché non mi ci sono soffermato tanto ma funziona (il pivot viene scelto staticamente, cosa non proprio tra le migliori ma comunque efficace)

codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
        char nome[20];
        float x;
        } struttura;

void sort(struttura *, int, int);
void swap(struttura *, struttura *);
void immissione_dati(struttura *, int);
void visualizza_dati(struttura *, int);

int main(void)
{
  struttura *array;
  int i, n;
  
  printf("Immettere il numero delle componenti dell'array da ordinare: ");
  scanf("%d%*c", &n);
  
  array = (struttura *)malloc(n*sizeof(struttura));
  
  immissione_dati(array, n);

  puts("\n");
  
  sort(array, 0, n-1);
  
  visualizza_dati(array, n);
  
  scanf("\n%*c");
  return 0;
}

void sort(struttura *array, int inizio, int fine) {

  int i, j;
  struttura pivot; 

  if (fine > inizio) {
     pivot = *(array + inizio);
     i = inizio + 1;
     j = fine + 1;
     while(i < j) {
        if(array[i].x < pivot.x) 
           i++;
        else {
           j--;
           swap(array + i, array + j);
        }
     }
     i--;
     swap(array + inizio, array + i);
     sort(array, inizio, i);
     sort(array, j, fine);
  }
}

void swap(struttura *p1, struttura *p2) {

  struttura temp;
  
  temp=*p2;
  *p2=*p1;
  *p1=temp;
}

void immissione_dati(struttura *array, int n) {
     
     short i;
     
     printf("Immettere i dati:\n");
     for (i=0; i<n; i++) {
        printf("\nStruttura %hd\nNome: ", i+1);
        gets(array[i].nome);
        printf("Float: ");
        scanf("\n%f%*c", &(array[i].x));
        puts("\n");
     }
}

void visualizza_dati(struttura *array, int n) {

  short i;

  for (i=0; i<n; i++) {
     printf("Nome: %s\nFloat: %f\n\n", array[i].nome, array[i].x);
  }
}