Newsgroup: it.comp.lang.c++
Titolo: Ordinamento crescente per selezione - vostro parere

 
Ho provato a scrivere il seguente programma di ordinamento crescente
per selezione, *senza sbirciare le soluzioni in rete*,  (studiando
solo l'algoritmo utilizzato):
 
 
=========================================
 
//Ordinamento crescente per selezione
 
#include <iostream>
 
using namespace std;
 
int main()
 
{
 
const int n=5;
int a[n]={43,9,4,37,93};
 
 
 for (int i=0; i < n-1; i++)
 
 {
 
 int minim=a[i],p=i;
 bool v=false;
 
    for (int j=i+1; j < n; j++)
    {
 
        if (minim>a[j])
        {
 
        minim=a[j];
 
        p=j;
        v=true;
 
        }
 
    }
 
// Se v e' vera scambia
 
 if (v==true)
 {
 
 int temp=0;
 
 temp=a[i];
 
 a[i] =minim;
 
 a[p]=temp;
 
 
 }
 
 
 }
 
 
for (int k=0; k < n; k++)
 
{
 
   cout<<a[k]<<" ";
}
 
return 0;
 
}
 
=====================================
 
....ho perso molto tempo nell'impostare correttamente gli indici dei
cicli for...infatti, inizialmente, per alcuni dati dell'array da
ordinare, il programma sembrava dare il corretto ordinamento ma per
altri dati non ottenevo l'ordinamento.
 
Adesso sembra OK...ma vorrei un vostro parere in tal senso ed
eventualmente se si possono apportare miglioramenti.
 
Ciao e grazie milleee!
 
 
 


E' il classico algoritmo con scambio
Dici che funziona, e dal punto di vista del codice mi sembra corretto 
(non l' ho nè compilato nè eseguito).
Ovviamente in un programma reale, cioè un programma che non è puro 
esercizio, nessuno si sognerebbe di farsi un algoritmo di sort a meno 
che non sia un ricercatore.
Esistono algoritmi di sort sicuramente migliori
Se hai studiato le proprietà degli algoritmi saprai che l' efficienza di 
un algoritmo si misura usando una notazione chiamata O (O grande)
 
 
 
 
 


...era solo un programma a scopo didattico...ho provato a semplificare
il precedente programma eliminando la variabile minim, ma NON
funziona, dove sbaglio?
 
==================================================
 
//Ordinamento crescente per selezione
 
#include <iostream>
 
using namespace std;
 
int main()
 
{
 
const int n=5;
 int a[n]={43,9,4,37,93};
 
 for (int i=0; i < n-1; i++)
 
 {
 
  int p=i;
  bool v=false;
 
    for (int j=i+1; j < n; j++)
     {
 
        if (a[j]<a[i])
         {
 
         p=j;
         v=true;
 
        }
 
    }
 
// Se v e' vera scambia
 
 if (v==true)
  {
 
 int temp=0;
 
 temp=a[i];
 
 a[i] =a[p];
 
 a[p]=temp;
 
 }
 
 }
 
for (int k=0; k < n; k++)
 
{
 
   cout<<a[k]<<" ";
 
}
 
return 0;
 
}
 
==========================================
 
Ciao e grazie mille!
 
 
 
 
 
 
 


Ho trovato l'errore : if (a[j]<a[i]) deve essere  if (a[j]<a[p]).
 
Ciao e grazie milleeeee!
 
 
 
 


Io direi che la variabile v � superflua: la puoi eliminare e al posto di
if (v==true)
scrivere
if (p != i)
 
Poi, le variabili dovrebbero avere un nome significativo:
es. al posto di p, metti lower_value_index.
 

 es. al posto di p, metti lower_value_index.
 
Vero, spesso è un'aspetto che trascuro per la fretta di voler
verificare se il programma che ho scritto è funzionante.
 
Ciao e grazie mille per i preziosi suggerimenti!!!