Algoritmy usporadúvania

Quick sort

 

Implementácia

Nasleduje funkcia v jazyku C, ktorá implementuje algoritmus Quick sort. Uvedená funkcia vstupné pole celých čísel usporiada vzostupne.

//prve volanie funkcie
int_q_sort_vzostup(pole_int, 0, dlzka-1);

//******QUICK SORT*******
//vstup: pole celych cisel urcene na usporiadanie, lavy a pravy index, medzi ktorymi bude pole usporiadane (pri prvom volani: lavy = 0 a pravy = dlzka-1)
//ucel: vzostupne usporiadanie zadaneho pola
//algoritmus: Quick sort, rekurzivna podoba algoritmu
//vystup: (void)
void int_q_sort_vzostup(int *pole, int lavy, int pravy)
{
	int pivot_index, zac_lavy, zac_pravy;	//indexy
	int pivot;				//pivot

	//v zac_lavy, zac_pravy si uchovame pociatocnu hodnotu lavy a pravy
	zac_lavy = lavy;
	zac_pravy = pravy;

	//zvolime si pivot
	//za pivota vyberame prvy prvok v "lavej" casti pola,tj podla "laveho" indexu
	presuny++;
	pivot = pole[lavy];
  
	while (lavy < pravy){
		//testujeme ci je prvok v "pravej" casti pola vacsi ako pivot 
		//pre zostupne usporiadanie bude podmienka: 
		//while( (pole[pravy] <= pivot) && (lavy < pravy) )
		while( (pole[pravy] >= pivot) && (lavy < pravy) ){
			porovnania++;
			pravy--;
		}
		if(lavy < pravy) 
			porovnania++;

		//ak najdeme prvok mensi ako pivot(v pravej casti) a ich indexy sa nezhoduju,
		//tj su to dva rozne prvky, tak na miesto prvku, ktory je na pozicii lavy
		//dame tento mensi prvok z "pravej" casti
		//pricom pivot(hodnota)ostava nezmeneny
		if (lavy != pravy){
			presuny++;
			pole[lavy] = pole[pravy];
			lavy++;		
			//posunieme sa v lavej casti a prave skopirovany prvok z pravej casti sa
			//pri porovnavani lavej casti pola v tomto cykle uz neporovnava
			//pretoze uz vieme ze je mensi nez pivot
		}

		//testujeme, ci su prvky v "lavej" casti pola mensie ako pivot
		//pre zostupne usporiadanie bude podmienka: 
		//while( (pole[lavy] <= pivot) && (lavy < pravy) )
		while( (pole[lavy] <= pivot) && (lavy < pravy) ){
			porovnania++;
			lavy++;
		}
		if(lavy < pravy)
			porovnania++;

		//ak najde prvok vacsi ako pivot a tento sa nachadza v lavej casti
		//skopiruje tento prvok do pravej casti na miesto, z ktoreho bol predtym kopirovany
		//mensi prvok z pravej casti do lavej
		//ak predtym nebol najdeny ziaden prvok v pravej casti mensi ako pivot
		//tak indexy lavy a pravy sa rovnaju, 
		//tj. vstupne podmienky(lavy != pravy, lavy < pravy) su nesplnene
		if (lavy != pravy){
			presuny++;
			pole[pravy] = pole[lavy];
			pravy--;
		}
	}
	
	//nakoniec sa pivot skopiruje na miesto ktore oddeluje pravu a lavu cast pola
	//toto miesto je teraz dane indexom lavy
	presuny++;
	pole[lavy] = pivot;
	pivot_index = lavy;

	//do lavy a pravy dame hodnoty, ktore mali tieto indexy na zaciatku volania funkcie
	lavy = zac_lavy;
	pravy = zac_pravy;
	//volanie funkcie q_sort pre lavu cast prave spracovavaneho pola
	if (lavy < pivot_index){
		rek_volania++;
		int_q_sort_vzostup(pole, lavy, pivot_index-1);
	}
	//volanie funkcie q_sort pre pravu cast prave spracovavaneho pola
	if (pravy > pivot_index){  
		rek_volania++;
		int_q_sort_vzostup(pole, pivot_index+1, pravy);
	}

	return;
}