2015-09-17 4 views
5

Sto provando a scrivere questo tipo di selezione da alto a basso e non sono abbastanza sicuro di come farlo. Sono abbastanza nuovo negli algoritmi di ordinamento.Come invertire la selezione sort

public void selectionSort(String[ ] data){ 
    // for each position, from 0 up, find the next smallest item 
    // and swap it into place 
    for (int place=0; place<data.length-1; place++){ 
     int minIndex = place; 
     for (int sweep=place+1; sweep<data.length; sweep++){ 
      if (data[sweep].compareTo(data[minIndex]) < 0) 
       minIndex=sweep; 
     } 
     swap(data, place, minIndex); 
    } 
} 

La ragione di questo che sto cercando di cambiare è che la selezione tipo qui attraversa la parte restante della matrice, alla ricerca del valore minimo e poi scambia agli front.I vogliono cambiare l'algoritmo in modo che cerchi anche il valore massimo nella parte rimanente e lo scambia sul retro, in modo da creare una lista ordinata dal fronte e dal retro allo stesso tempo.

Tutto l'aiuto sarebbe apprezzato :)

+1

Che cosa vuoi dire? ordine decrescente? –

+0

@SleimanJneidi sì, in ordine decrescente –

+2

Credo che cambi solo - 'if (dati [sweep] .compareTo (data [minIndex])> 0)' –

risposta

2

Hai solo bisogno di negare il metodo compareTo

if(data[sweep].compareTo(data[minIndex]) > 0) 
    minIndex=sweep; 
+0

quindi Non ha qualcosa a che fare con i forloops? –

+0

No, tutto rimane lo stesso, ma invece di maggiore di quello che usi meno di –

+0

quindi il problema che sto cercando di fare qui è che l'algoritmo standard attraversa la parte restante dell'array, cercando il valore minimo e poi lo scambio in primo piano Cambia l'algoritmo in modo che cerchi anche il valore massimo nella parte rimanente e lo scambia sul retro, in modo da creare una lista ordinata dal fronte e dal retro allo stesso tempo. Questo metodo fa questo? @SleimanJneidi –

2

a Selezionare sorta trovare l'elemento più piccolo rimanendo in ogni iterazione e mette al posto giusto. Invece, si desidera trovare il più grande elemento rimanente. Il modo più semplice per farlo è semplicemente capovolgere la condizione di selezione. Invece di:

if (data[sweep].compareTo(data[minIndex]) < 0) 

Si dovrebbe usare:

if (data[sweep].compareTo(data[minIndex]) > 0) 
+0

Oh okay, l'ho provato e penso che funzioni. Rende più lento l'ordinamento di un insieme non ordinato rispetto a quando è in ascesa? –

+0

Ho un metodo che controlla se l'array è ordinato e dice che non lo è? Sono davvero confuso –

+0

@NandaArdianto, mantieni una domanda per post. Si prega di avere un nuovo post con il codice di quel metodo? – Mureinik