sort ordenar numeros metodo llenar forma descendente con burbuja bubble arreglo algoritmo aleatorios c# .net sorting collections

numeros - ¿C#ordenar la lista y también devolver las posiciones del índice original?



ordenar numeros aleatorios en c++ (3)

Me interesa clasificar una colección, pero también devolver un índice que se puede usar para mapear la posición original en la colección (antes de la clasificación).

Permítanme darles un ejemplo para que quede más claro:

List<int> A = new List<int>(){3,2,1}; List<int> B; List<int> idx; Sort(A,out B,out idx);

Después de lo cual:

A = [3,2,1] B = [1,2,3] idx = [2,1,0]

De modo que la relación entre A, B, idx es:

A[i] == B[ idx[i] ] , para i = 0 ... 2

¿C # /. Net tiene algún mecanismo incorporado para que esto sea fácil de implementar?

Gracias.


Mientras Mark Byers le proporcionó una solution utilizando LINQ, quiero mostrarle otra solución utilizando .NET Framework.

Existe una sobrecarga de Array.Sort que hará esto por usted:

int[] a = new[] { 3, 2, 1 }; int[] p = new[] { 0, 1, 2 }; Array.Sort(a, p); Assert.IsTrue(a.SequenceEquals(new[] { 1, 2, 3 })); Assert.IsTrue(p.SequenceEquals(new[] { 2, 1, 0 }));

Por lo tanto, aquí hay un método genérico que cumple su especificación que aprovecha esta sobrecarga:

void Sort<T>( List<T> input, out List<T> output, out List<int> permutation, IComparer<T> comparer ) { if(input == null) { throw new ArgumentNullException("input"); } if(input.Count == 0) { // give back empty lists output = new List<T>(); permutation = new List<int>(); return; } if(comparer == null) { throw new ArgumentNullException("comparer"); } int[] items = Enumerable.Range(0, input.Count).ToArray(); T[] keys = input.ToArray(); Array.Sort(keys, items, comparer); output = keys.ToList(); permutation = items.ToList(); }


Se puede hacer fácilmente usando Linq.

  • Convierta su lista en una nueva lista de pares (objeto, índice original del objeto).
  • Ordenar la nueva lista por el primer elemento en el par
  • Extraiga la lista ordenada y los índices originales.

Aquí hay un código para demostrar el principio:

List<int> A = new List<int>() { 3, 2, 1 }; var sorted = A .Select((x, i) => new KeyValuePair<int, int>(x, i)) .OrderBy(x => x.Key) .ToList(); List<int> B = sorted.Select(x => x.Key).ToList(); List<int> idx = sorted.Select(x => x.Value).ToList();

Creo que esto da A [idx [i]] = B [i], pero espero que sea lo suficientemente bueno para ti.


Un enfoque de alguna manera más elegante usando lambda

Array.Sort<int>(idx, (a, b) => A[a].CompareTo(A[b]));

esto le da a ux array de la matriz A