Ordenar vetor com posições aleatórias

Bom dia Amigos, não estou conseguindo implementar o metodo InsereOrdenado, as posições aleatórias do vetor me deixam confuso.

class ListaUsandoVetor {
  int tam_vet_elem, prim, num_elem;
  No vet_elem[];
  
  ListaUsandoVetor(int tam_vet_elem) {
    prim = -1;
    num_elem = 0;
    this.tam_vet_elem = tam_vet_elem;
    vet_elem = new No[tam_vet_elem];
    int i;
    
    for(i = 0; i < tam_vet_elem; i++)
      vet_elem[i] = null;
  }
  
  class No {
    int mat;
    float nota;
    String nome;
    int prox_no;
    
    No(int mat, float nota, String nome) {
      this.mat = mat;
      this.nota = nota;
      this.nome = nome;
      prox_no = -1;
    }
  }
  
  void InsereOrdenado(int mat, float nota, String nome) {
    int num_elem = 3;
    int tam_vel_elem = 3;
    
    Random gerador = new Random();
    int n;
    
    do {
      n = gerador.nextInt() % tam_vet_elem;
      
      if ((n >= 0) && (vet_elem[n] == null))
        break;
    } while(true);
    
    vet_elem[n] = new No(mat, nota, nome);
    No aux = vet_elem[n];
    int pos = num_elem -1;
    
    while ((pos > -1) && (vet_elem[pos].nota > aux.nota))
      vet_elem[pos + 1] = vet_elem[pos];
    
    aux = vet_elem[pos + 1];
    num_elem++;
  }
  
  void Imprime() {
    int ind = prim;
    
    while (ind != -1) {
      System.out.println(vet_elem[ind].mat + " " + vet_elem[ind].nota + " " + vet_elem[ind].nome);
      ind = vet_elem[ind].prox_no;
    }
  }

Amigo não sei qual seu objetivo, porém utilizando a lib Collections sugiro seguir os seguintes passos:
1 - alimente sua lista sem se preocupar com a ordem
2 -ordene conforme sua regra
3 - imprima

Abaixo um exemplo



import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Teste {

	public static void main(String[] args) {

		// jogue seus objetos na lista de qualquer jeito. Apenas adicione. ( Sua classe
		// deve implementar Comparable)

		List<Obj> obj = new ArrayList<>();
		obj.add(new Obj(1, 1f, "jão1"));
		obj.add(new Obj(3, 2f, "jão2"));
		obj.add(new Obj(2, 3f, "jão3"));
		obj.add(new Obj(4, 4f, "jão4"));
		obj.add(new Obj(5, 5f, "jão5"));

		// imprime desordenada
		imprime(obj);
		System.err.println("----------------------");




		// ordena a lista de acordo com a regra definida no metodo compare to na sua
		// classe
		Collections.sort(obj);
		// imprime ordenada
		imprime(obj);



		System.err.println("----------------------");
		// reverte a ordem se for necessario
		Collections.reverse(obj);
		// imprime ordenada com ordem invertida
		imprime(obj);



	}


	private static void imprime(Iterable<Obj> obj) {
		obj.forEach(p -> {
			System.out.println(p.getMat() + " - " + p.getNota() + " - " + p.getNome());
		});

	}


}


class Obj implements Comparable<Obj> {
	int    mat;
	Float  nota;
	String nome;

	public Obj(int mat, Float nota, String nome) {
		super();
		this.mat = mat;
		this.nota = nota;
		this.nome = nome;
	}

	public int getMat() {
		return mat;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	public Float getNota() {
		return nota;
	}

	public void setNota(Float nota) {
		this.nota = nota;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Override
	public int compareTo(Obj outroobjeto) {
		// escolha aqui qual será o atributo usado para ordenar a lista neste exemplo
		// usei o parametro mat


		if (this.mat > outroobjeto.getMat()) {
			return -1;
		}
		if (this.mat < outroobjeto.getMat()) {
			return 1;
		}
		return 0;
	}


}

A saida será:

1 - 1.0 - jão1
3 - 2.0 - jão2
2 - 3.0 - jão3
4 - 4.0 - jão4
5 - 5.0 - jão5

5 - 5.0 - jão5
4 - 4.0 - jão4
3 - 2.0 - jão2
2 - 3.0 - jão3
1 - 1.0 - jão1

1 - 1.0 - jão1
2 - 3.0 - jão3
3 - 2.0 - jão2
4 - 4.0 - jão4
5 - 5.0 - jão5