2011-03-25 23 views
42

Tengo una matriz de int que debo ordenar descendiendo.Mejor manera de ordenar la matriz en orden descendente

Dado que no he encontrado ningún método para ordenar la matriz en orden descendente order.Currently estoy ordenando la matriz en orden descendente de la siguiente manera

int[] array = new int[] { 3, 1, 4, 5, 2 }; 
Array.Sort<int>(array); 
Array.Reverse(array); 

Ahora, la pregunta es that.Is Hay alguna forma mejor hacer lo mismo en C#?

Respuesta

46

Dependiendo del criterio de ordenación, se puede hacer esto:

int[] array = new int[] { 3, 1, 4, 5, 2 }; 
    Array.Sort<int>(array, 
        new Comparison<int>(
          (i1, i2) => i2.CompareTo(i1) 
        )); 

... o esto:

int[] array = new int[] { 3, 1, 4, 5, 2 }; 
    Array.Sort<int>(array, 
        new Comparison<int>(
          (i1, i2) => i1.CompareTo(i2) 
        )); 

i1 e i2 son exactamente a la inversa.

+9

Este, o simplemente añadir un '-' (signo menos) antes de' CompareTo' – digEmAll

+0

@digEmAll: Absolutamente;) – JYL

+10

O simplemente 'Array.Sort (array, (a, b) => b.CompareTo (a))' para una ordenación inversa. –

2

Sí, puede pasar el predicado para ordenar. Esa sería su implementación inversa.

2

Puede especificar un comparador (implementación IComparer) como parámetro en Array.Sort, el orden de clasificación realmente depende del comparador. El comparador predeterminado se utiliza en ordenación ascendente

52

Utilice el método LINQ OrderByDescending. Devuelve IOrderedIEnumerable<int>, que puede convertir a Array si lo necesita. En general, List<> s son más funcionales que Array s.

array = array.OrderByDescending(c => c).ToArray(); 
+1

¡Me ganaste! :) –

+5

Este es un código corto de trabajo, pero si la matriz es grande, no es muy eficiente (en términos de rendimiento), porque la matriz se convierte primero en lista, luego se ordena y finalmente se convierte en matriz. Me equivoco ? – JYL

+0

@Ilyusha, si considera 'int' desde la perspectiva de objetos compuestos (no objetos simples), entonces' int' es el mismo objeto como otros, porque cualquiera de los dos objetos necesita comparar hasta la 1ª diferencia, entonces O (n) es resultado imposible –

9

Seguro, Usted puede personalizar el género.

Debe dar al Sort() un delegado a un método de comparación que usará para ordenar.

Usando un método anónimo:

Array.Sort<int>(array, 
delegate(int a, int b) 
    { 
    return b - a; //Normal compare is a-b 
    }); 

leer mas sobre esto:

Sorting arrays
MSDN - Array.Sort Method (T[], Comparison)

+1

Esto no funcionará correctamente en caso de desbordamiento. – Henrik

Cuestiones relacionadas