Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [java] un esercizio per chi ne ha voglia

    Ciao a tutti. Ho fatto un esercizio di java, che penso ci sia più di una soluzione, inoltre la mia(credo non sia l'unica) non mi piace molto.
    Se ne avete voglia vi scrivo il testo, sono poche righe ma ben pensate, cosi oltre a esercitarvi, poi potremmo confrontarlo.

    metodo statico che presi come paramentri un array di interi e un intero faccia in modo che tutti gli elementi minori di x precedano quelli maggiori di x. IL METODO DEVE USARE SOLO UN CICLO e non avere array aggiuntivi.

  2. #2
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Non è vero :bubu:

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Beh... c'è andato vicino: è la procedura Partition del QuickSort.

    codice:
      private static int partition(int[] a, int pivot) {
        int i = 0; 
        int j = a.length - 1;
        while (i < j) {
          while (a[i] < pivot) i++;
          while (a[j] > pivot) j--;
          if (i < j) {
            int tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
          }
        }
        return i; 
      }
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    apparte che prendere i metodi confezionati era fuori spirito di come l'avevo proposto, inoltre deve avere solo un ciclo, ciò vuol dire che se scegli un while poi hai esaurito la scorta di cicli che puoi usare.


  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ok... allora modifichiamo il codice, rendendolo un po' più bruttino:
    codice:
    private static int partition(int[] a, int pivot) {
      int i = 0; 
      int j = a.length - 1;
      while (i < j) {
        if (a[i] < pivot) {
          i++;
        } else {
          if (a[j] > pivot) {
            j--;
          } else {
            if (i < j) {
              int tmp = a[i];
              a[i] = a[j];
              a[j] = tmp;
            }
          }
        }
      }
      return i; 
    }


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    I precedenti algoritmi comunque funzionano solo se non ci sono ripetizioni all'interno dell'array, una versione che funziona anche in questo caso è:

    Codice PHP:
    void part(int array[], int x){
        
    int last = array.length 1;
        
    int first 0;
        
    int swap 1;
        for(; ((
    first last) && (swap <= last)); ){
            
    //primo elemento maggiore del pivot
            
    if(array[first] > x){
                
    int temp = array[first];
                array[
    first] = array[last];
                array[
    last] = temp;
                
    last--;
            }
            
    //primo elemento minore del pivot
            
    else if(array[first] < x){
                
    first++;
                
    swap++;
            }
    //primo elemento uguale al pivot
            //cerco tra gli elementi rimasti uno minore del pivot
            
    else{
                if(array[
    swap] < array[first]){
                    
    int temp = array[first];
                    array[
    first] = array[swap];
                    array[
    swap] = temp;
                    
    first++;
                    
    swap first 1;
                }
                else
                    
    swap++;
            }
            
        }


  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Beh... a dire il vero quella è la procedura effettiva della Partition del QuickSort (non l'ho inventata io)... cosa c'entrano gli elementi ripetuti? Il confronto si basa con un pivot, e se ci sono elementi uguali li posso anche scambiare che non cambia nulla...



    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da LeleFT
    cosa c'entrano gli elementi ripetuti? Il confronto si basa con un pivot, e se ci sono elementi uguali li posso anche scambiare che non cambia nulla...
    Bhè, se l'elemento pivot è presente piu volte nell'array l'algoritmo potrebbe non funzionare, pensa al caso in cui il primo e l'ultimo elemento siano uguali al pivot: l'algoritmo continuerebbe a scambiarli l'uno con l'altro senza sbloccarsi,


  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Piccolo aggiustamento:

    Codice PHP:
    void part(int array[], int x){
        
    int last = array.length 1;
        
    int first 0;
        
    int swap 1;
        while((
    first last) && (swap <= last)){
            
    //primo elemento maggiore del pivot
            
    if(array[first] > x){
                
    int temp = array[first];
                array[
    first] = array[last];
                array[
    last] = temp;
                
    last--;
            }
            
    //primo elemento minore del pivot
            
    else if(array[first] < x){
                
    first++;
                
    swap++;
            }
            
    //primo elemento uguale al pivot
            //cerco tra queli rimanenti un elemento diverso
            //dal pivot e lo scambio col primo elemento
            
    else{
                if(array[
    swap] != x){
                    array[
    first] = array[swap];
                    array[
    swap] = x;
                }
                else
                    
    swap++;
            }
        }


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.