Selection sort in C++

Qui presentiamo il Selection sort, detto anche algoritmo per selezione o da alcuni sel-sort, un algoritmo di ordinamento di un array, non particolarmente efficiente, ma facile da comprendere e implementare.
Questo algoritmo, chiamato anche ordinamento per minimi successivi, è importante a fini didattici,  tuttavia anche se nella pratica in realtà non si usa per la sua inefficienza, non c’è programmatore che non lo conosca.

La problematica di ordinare un array è una problematica che spesso si deve affrontare, pensiamo ad esempio a fare la classifica di giocatori per punteggio, studenti per numero di assenze, candidati per numero di voti…

Seguono l’idea del funzionamento, un video di spiegazione, il codice in C++ di un’implementazione dell’algoritmo e qualche considerazione sulla complessità computazionale .

Idea del funzionamento del Selection sort

selection_sort_animation
Immagine dalla voce di wikipedia sul selection sort

‘idea di base è semplice, si cercano successivamente i minimi dell’array.
Questo algoritmo “divide” di fatto l’array in due parti, la prima ordinata e le seconda non-ordinata, inizialmente la prima parte non conterrà alcun elemento.
L’algoritmo continuerà a cercherà il minimo tra gli elementi della parte non-ordinata e lo scambierà con il primo elemento della parte non ordinata, andando così ad aumentare di uno la dimensione della parte ordinata.
L’algoritmo termina quando la parte non-ordinata contiene un solo elemento, che sarà il massimo dell’array, e quindi l’array sarà completamente ordinato.

Video di spiegazione del selection sort

Ecco una mia breve spiegazione e implementazione in C++ dell’algoritmo selection sort.


Codice del selection sort

Qui sotto in immagine il codice in C++ del selection sort realizzato nel video, la versione eseguibile si trova al link: selection sort.

selection sort

Complessità computazionale selection sort

Per chi conoscesse già cosa si intende con complessità computazionale, la complessità computazionale di questo algoritmo è O(n²).

Ricerca Binaria o Dicotomica in un array in C++ versione iterativa e ricorsiva

Come cercare un elemento all’interno di un array?
La ricerca di un elemento in un array si può sempre effettuare con il classico algoritmo di ricerca sequenziale: si verifica in ogni elemento dell’array se è presente il valore da cercare; tuttavia nel caso si abbia che fare con il problema della ricerca di un elemento in un array ordinato si può usare un algoritmo più performante che è quello della Ricerca Binaria spesso anche chiamata Ricerca Dicotomica; Qui sotto vi spiegherò il suo funzionamento proponendovi tra l’altro due versione dello stesso: una usando l’iterazione e l’altra usando la ricorsione.

Mi raccomando che la condizione necessaria per poter usare questo algoritmo con successo è che l’array sul quale lo si applica sia ordinato; se si prova ad applicarlo a un array disordianto l’algoritmo generalmente non funziona.

Versione iterativa dell’algoritmo di ricerca binaria

Per comprendere il funzionamento dell’algoritmo di ricerca binaria vi invito a guardare questo video che ho realizzato e in cui presento la sua versione iterativa e ne scrivo il codice in C++.

Qui sotto trovate il codice realizzato nel video:

codice dell'algoritmo della ricerca binaria in C++
il codice dell’algoritmo di ricerca binaria versione iterativa in C++ realizzato nel video

Al seguente link trovate il codice della ricerca binaria iterativa in C++ realizzato nel video.

Ovviamente si può implementare il codice della ricerca binaria all’interno di una funzione, in modo che poi lo si possa riutilizzare e ci si possa lavorare con array di lunghezza arbitraria.

Perché è vantaggioso l’algoritmo di ricerca binaria?
Perché l’algoritmo di ricerca binaria è più performante rispetto alla ricerca sequenziale: nel caso peggiore andrà a fare log(l) confronti tra il valore da cercare e gli elementi dell’array, dove l è la lunghezza dell’array,  rispetto agli l confronti della ricerca sequenziale.

Versione ricorsiva dell’algoritmo di ricerca binaria

Si può anche realizzare una versione ricorsiva di questo algoritmo di ricerca.

Nel video una breve spiegazione della versione ricorsiva e la realizzazione del suo codice.

Qui sotto trovate il codice realizzato nel video:

il codice in C++ dell'algoritmo della ricerca binaria in C++
il codice dell’algoritmo di ricerca binaria versione ricorsiva in C++ realizzato nel video

Al seguente link trovate il codice della ricerca binaria ricorsiva in C++ realizzato nel video.

Quanto detto della versione iterativa sul numero di confronti vale anche per la versione ricorsiva, tuttavia come regola generale è sempre bene preferire la versione iterativa, a quella ricorsiva di un algoritmo in quanto grava meno sulla memoria e diminuisce il  numero di operazioni non essendoci le operazioni relative al copiare i valori delle variabili passate per valore.

Esercizio C++ con soluzione: leggere tre caratteri e verificare se nel terzo è memorizzata la distanza tra gli altri due

Argomenti: if (selezione), operatori booleani (connettivi logici and or not), char (caratteri), programmazione, C++

Testo esercizio: Creare un programma che fa inserire in input tre caratteri e nel caso il terzo sia una cifra verifica se i primi due caratteri sono distanti tra loro esattamente il valore della cifra.

Video soluzione:

Codice soluzione: https://onlinegdb.com/HJQi1gYr8

Altri esercizi risolti con gli if qui:
https://ticoprof.wordpress.com/2016/03/29/esercizi-di-programmazione-selezione/

Esercizio C++ con soluzione: leggere due caratteri e verificare se sono lettere minuscole e nel caso controllare se la distanza della prima dalla ‘a’ è uguale alla distanza della seconda dalla ‘z’.

Argomenti: if (selezione), operatori booleani (connettivi logici and or not), char (caratteri), programmazione, C++

Testo esercizio: Creare un programma che fa inserire in input due caratteri e verifica se sono due lettere minuscole e, qualora lo siano, verifica se la distanza della prima lettera dalla ‘a’ è uguale alla distanza della seconda dalla ‘z’.
NB: per distanza tra due lettere si intende il numero di lettere nell’insieme
che va dalla prima lettera (esclusa) alla seconda lettera inclusa, la distanza
tra ‘a’ e ‘c’ è 2.

Video soluzione:

Codice soluzione: https://onlinegdb.com/rkQKo1YrL

Altri esercizi risolti con gli if qui:
https://ticoprof.wordpress.com/2016/03/29/esercizi-di-programmazione-selezione/

Esercizio C++ if e char: una password di 4 caratteri contiene lettere maiuscole, minuscole e cifre?

Argomenti: if (selezione), char (caratteri), programmazione, C++

Testo esercizio: Creare un programma che fa inserire in input una password di 4 caratteri un carattere alla volta e verificare che ci sia almeno una lettera minuscola, una maiuscola e una cifra.

Video soluzione:

Codice soluzione: https://onlinegdb.com/Hy_jA0uHU

Altri esercizi risolti con gli if qui:
https://ticoprof.wordpress.com/2016/03/29/esercizi-di-programmazione-selezione/

Esercizio C++ array: stampare gli elementi di un array che sono più grandi del maggior numero di elementi dell’array stesso

Argomenti: array, programmazione, C++

Testo esercizio: Creare un programma che letto un array di dieci posizioni memorizzi e stampi i valori contenuti nell’array che sono più grandi del maggior numero di valori che li precedono nell’array.
Ad esempio: se l’array contiene 1 1 1 1 1 8 6 14 13 il programma stamperà 14 e 13.

Video soluzione:

Codice soluzione: https://onlinegdb.com/SkXlxqwSU

Altri esercizi risolti con gli array in C++ qui:
https://ticoprof.wordpress.com/2016/04/26/esercizi-con-gli-array/

Esercizio C++ array: memorizzare in un array solo i numeri primi contenuti in un primo array senza ripetizioni

Argomenti: array, programmazione, C++

Testo esercizio: Dato un array di naturali con 20 posizioni, memorizzare in un secondo array solo i numeri primi senza ripetizioni.

Video soluzione:

Codice soluzione: https://onlinegdb.com/rk2iycPrL

Altri esercizi risolti con gli array in C++ qui:
https://ticoprof.wordpress.com/2016/04/26/esercizi-con-gli-array/

Esercizio C++ array: memorizzare in un array solo gli elementi di un primo array non divisibili per altri elementi del primo array

Argomenti: array, array parzialmente riempiti, programmazione, C++

Testo esercizio: Leggere un array di interi con 10 posizioni e memorizzare in un secondo array solo i numeri del primo che non sono divisibili per nessun altro numero del primo array e alla fine stampare il contenuto del secondo array.

Video soluzione:

Codice soluzione: https://onlinegdb.com/B1it1cDB8

Altri esercizi risolti con gli array in C++ qui:
https://ticoprof.wordpress.com/2016/04/26/esercizi-con-gli-array/

Esercizio C++ array: creare una funzione che verifica se due array sono uguali o con un valore differente

Argomenti: array, funzioni, programmazione, C++

Testo esercizio: Creare una funzione che verifica se due array sono uguali o con al più un valore differente.

Video soluzione:

Codice soluzione: https://onlinegdb.com/HJkL19DB8

Altri esercizi risolti con gli array in C++ qui:
https://ticoprof.wordpress.com/2016/04/26/esercizi-con-gli-array/

Esercizio C++ array: sommare i valori di un array che coincidono con la posizione

Argomenti: array, programmazione, C++

Testo esercizio: Leggere un valore n (al più pari a 20) e poi leggere n valori di un array di interi; dopo averli letti sommare i valori che coincidono con il valore della posizione e comunicare la somma all’utente.

Video soluzione:

Codice soluzione: https://onlinegdb.com/HkxrEkqDSL

Altri esercizi risolti con gli array in C++ qui:
https://ticoprof.wordpress.com/2016/04/26/esercizi-con-gli-array/