Aspecte teoretice:
Selectia directã este una dintre cele mai simple metode de sortare si va lucra foarte bine pentru tabele mici, fiecare element (înregistrare), este mutat cel mult o datã.. Implementarea algoritmului este simplu.
Algoritmul presupune ca la fiecare pas “i “ sa se gaseasca elementul minim dintre a[i+1], a[i+2]…a[n] si se interschimba cu a[i].
Analiza complexității:
Se cheltuie cel mai mult timp cu cãutarea elementului minim din partea nesortatã a tabelei. Cãutarea se face de la stânga la dreapta. Pe parcursul fiecãrui pas este necesar o interschimbare, deci numãrul interschimbãrilor pentru N elemente este: N-1. Numãrul total al comparatiilor este proportional cu N^2. Timpul de executie al algoritmului este de ordinul O(N 2)în caz mediu si nefavorabil, chiar si când tabela este deja în ordine sortatã (crescãtoare). Este o metodã stabilã.
Exemplu Pas cu Pas:
5 6 1 2 4 3
1 6 5 2 4 3
1 2 5 6 4 3
1 2 3 6 4 5
1 2 3 4 6 5
1 2 3 4 5 6
Implementare:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SelectionSortCS { class Program { static void SelectionSort(int n, int [] v) { for (int i = 0; i < n; i++) { int max = i; int aux; for (int j = i + 1; j < n; j++) if (v[max] > v[j]) max = j; aux = v[max]; v[max] = v[i]; v[i] = aux; } } static void Main(string[] args) { int n, i; int [] numere = new int[100]; Console.WriteLine("Numarul de elemente n: "); n = Convert.ToInt32(Console.ReadLine()); for (i = 0; i < n; i++) { Console.Write("Introduceti numarul #" + (i + 1) + " "); numere[i] = Convert.ToInt32(Console.ReadLine()); } SelectionSort(n, numere); Console.WriteLine("Vectorul sortat este "); for (i = 0; i < n; i++) Console.Write(numere[i] + " "); Console.ReadLine(); } } }
Module Module1 Sub SelectionSort(ByVal n As Integer, ByVal v() As Integer) Dim i As Integer Dim j As Integer For i = 0 To n Dim max As Integer max = i Dim aux As Integer For j = i + 1 To n If v(max) > v(j) Then max = j End If Next j aux = v(max) v(max) = v(i) v(i) = aux Next i End Sub Sub Main() Dim n, i As Integer Dim numere(100) As Integer Console.WriteLine("Numarul de elemente: ") n = Convert.ToInt32(Console.ReadLine()) For i = 0 To n Console.Write("Introduceti numarul #" & (i + 1) & " ") numere(i) = Convert.ToInt32(Console.ReadLine()) Next i SelectionSort(n, numere) Console.WriteLine("Vectorul sortat este ") For i = 0 To n Console.Write(numere(i) & " ") Next i Console.ReadLine() End Sub End Module
// SelectionSortCPP.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include<conio.h> using namespace std; void SelectionSort(int n, int v[]) { for(int i=0;i<n;i++) { int max=i, aux; for(int j=i+1;j<n;j++) if(v[max]>v[j]) max=j; aux=v[max]; v[max]=v[i]; v[i]=aux; } } int main() { int n, i, numere[100]; cout<<"Numarul de numere: ";cin>>n; for(i=0;i<n;i++) { cout<<"Introduceti numarul #"<<(i+1)<<": "; cin>>numere[i]; } SelectionSort(n,numere); cout<<endl<<"Vectorul sortat:"; for(i=0;i<n;i++) cout<<" "<<numere[i]; system("pause"); }
<?php function selection_sort($data) { for($i=0; $i<count($data)-1; $i++) { $min = $i; for($j=$i+1; $j<count($data); $j++) { if ($data[$j]<$data[$min]) { $min = $j; } } $data = swap_positions($data, $i, $min); } return $data; } function swap_positions($data1, $left, $right) { $backup_old_data_right_value = $data1[$right]; $data1[$right] = $data1[$left]; $data1[$left] = $backup_old_data_right_value; return $data1; } $my_array = array(3, 0, 2, 5, -1, 4, 1); echo "Vectorul original :\n"; echo implode(', ',$my_array ); echo "\nVectorul sortat :\n"; echo implode(', ',selection_sort($my_array)). PHP_EOL; sleep(10); ?>
class SelectionSortJAVA{ public static void SelectionSort(int n, int v[]) { for (int i = 0; i < n; i++) { int max = I; int aux; for (int j = i + 1; j < n; j++) if (v[max] > v[j]) max = j; aux = v[max]; v[max] = v[i]; v[i] = aux; } } public static void main(String[] args) { int a[]={7,4,5,3,1,8,9,2,6,0}; int i; SelectionSort(10,a); for (i=0;i<10;i++) System.out.println(a[i]+” “); } } |
Rezultat: