Windows[Algoritmi si Tehnici de Programare] Sortare Prin Selectie

Aici este Totul despre Windows!

Moderatori: Moderators, Founder

Mesaj

Avatar utilizator
CEO
Posts
3802
** Ce reprezinta si importanta procedeului de sortare **

Sortarea , a unei colectii , reprezinta procedeul prin care accesam si modificam POZITIA elementelor asociate acesteia , pe baza unui criteriu . De exemplu , putem ordona de la mic la mare (intr-o colectie de numere), de la A la Z (intr-o colectie de siruri de caractere) etc.

Sortarea se poate efectua sub mai multe procedee , unul mai optim decat altu din punct de vedere , a timpului de executie si a resurselor alocate .

Nota ** : Definim colectie orice entitate care contine o multime de elemente (array,lista,arbore etc.) ;

** In ce Consta Sortarea Prin Selectie **

Sortarea Prin Selectie se bazeaza pe doua bucle , una care acceseaza toate elementele colectiei iar cealalta , in interiorul acesteia , care compara repetitiv un element cu restul . Daca in comparatie, se gaseste un element mai mic acesta , se va efectua o interschimbare intre acestia.

** Exemplu Selectie prin Sortare **

Sa presupunem ca avem 6 numere naturale intr o colectie

Cod: Selectaţi tot

        [44 , 22, 67, 23 , 21, 11]  --> NUMERE NATURALE 
        [0  , 1 , 2 , 3  , 4 , 5 ]  --> INDECSI 
EFECTUAM O SORTARE A COLECTIEI DE LA MARE LA MIC :

Cod: Selectaţi tot

Prima Iteratie : i = 0 ; 

   1. 44 > 22 --> 44 mai mare decat 22 --> nu efectuam nimc --> continuam ; 
   2. 44 < 67 --> 44 mai mic  decat 67 --> efectuam interschimbarea -->  [67 , 22 , 44 , 23 , 21 , 11] ;
   3. 67 > 23 --> 67 mai mare decat 23 --> nu efectuam nimc --> continuam ; 
   4. 67 > 21 --> 67 mai mare decat 21 --> nu efectuam nimic --> continuam ;
   5. 67 > 11 --> 67 mai mare decat 11 --> nu efectuam nimic --> continuam .
   
A doua iteratie : i = 1 ;

   1. 22 < 44 --> 22 mai mic  decat 44 --> efectuam interschimbarea -->  [67 , 44 , 22 , 23 , 21 , 11] ;
   2. 44 > 23 --> 44 mai mare decat 23 --> nu efectuam nimc --> continuam ;
   3. 44 > 21 --> 44 mai mare decat 21 --> nu efectuam nimc --> continuam ;
   4. 44 > 11 --> 44 mai mare decat 11 --> nu efectuam nimc --> continuam .
   
A treia iteratie : i = 2 ; 
  
   1. 22 < 23 --> 22 mai mic decat 23 --> efectuam interschimbarea -->  [67, 44 , 23 , 22 , 21 , 11] ;
   2. 23 > 21 --> 23 mai mare decat 21 --> nu efectuam nimc --> continuam ;
   3. 23 > 11 --> 23 mai mare decat 11 --> nu efectuam nimc --> continuam .
   
 A patra iteratie : i = 3 ; 
  
   1. 22 > 21 --> 23 mai mare decat 21 --> nu efectuam nimc --> continuam ; 
   2. 22 > 11 --> 22 mai mare decat 11 --> nu efectuam nimic --> continuam .
   
 A cincea iteratie : i = 4 ; 
  
   1. 21 > 11 --> 21 mai mare decat 11 --> nu efectuam nimic --> continuam .
   
 FINAL ALGORITM  
 
 Algoritmul sortat de la mare la mic : [67, 44 , 23 , 22 , 21 , 11] 
NOTA ** : Pentru la mic la mare , doar inversam comparatia !!! Procedeul e acelasi !!
** Algoritm in C **

Cod: Selectaţi tot

#include <stdio.h>
#include <stdlib.h> // Pentru malloc & free


void selectionSorting(int** arr , int arrayBuffer)
{

	for (int i = 0; i < arrayBuffer - 1; i++) // Traversam toata colectia mai putin ultinmul element 
	{
		for (int j = i + 1; j < arrayBuffer; j++)
		{
			if ((*arr)[i] < (*arr)[j])  // "<" PENTRU NUMERE DESCRESCATOARE IAR ">" PENTRU NUMERE CRESCATOARE
			{
				// Efectuam Algoritmul de Inteschimbare 
				int temp = (*arr)[i];
				(*arr)[i] = (*arr)[j];
				(*arr)[j] = temp;
			}
			// Daca nu , continuam 
		}
		
	}
	
}

int main()
{
	int arrayBuffer;

	printf("Cate numere doresti sa aiba colectia : ");
	
	scanf_s("%d", &arrayBuffer);

	int* a = (int*)malloc(arrayBuffer * sizeof(int)); // ALOCAM UN ARRAY IN FUNCTIE DE CATE NUMERE VREA UTILIZATORUL SA INTRODUCA
	
	printf("Insereaza %d numere la intamplare : \n",arrayBuffer);


	for (int i = 0; i < arrayBuffer; i++)
	{
		printf("colectie[%d] = ", i);
		scanf_s("%d", &a[i]);  // Inseram numerele de la tastatura 

	}

	selectionSorting(&a,arrayBuffer);  // Transferam colectia prin adresa 


	/// Printam Colectia 

	printf("Printam colectia ordonata : \n");

	for (int i = 0; i < arrayBuffer; i++)
	{
		printf("v[%d]=%d\n", i, a[i]);
	}


		// Eliberam Memoria Ocupata de Array (Sa prevenim Memory Leak)

		free(a);  // Eliberam Colectia in sine 
		a = NULL; // Setam NULL Pointer 


	return 0;
}
NOTA 1 ** : E USOR DE IMPLENTAT SI INTELES , IDEAL UNDE SE LUCREAZA CU LISTE MICI SI SIMPLITATEA E NECESARA !!

NOTA 2 ** : CU CAT LISTA ESTE MAI MARE , CU ATAT VOM AVEA O COMPLEXITATE TIMP MAI MARE (MAI INEFICIENT) !!
========================
CONTACT : diliulro@yahoo.com
========================
Scrie răspuns