» »

Algoritmi za urejanje tabel

Algoritmi za urejanje tabel

Gregor5816 ::

V C sem si napisal bubble sort, selection sort in insertion sort. Za foro sem še izmeril koliko časa porabi kateri algoritem za urejanje in koliko primerjav in prirejanj pri tem opravi. Naredil sem 3 identične tabele in vsako spustil skozi en algoritem. Vedno se je izkazalo, da je najpočasnejši bubble sort, najhitrejši pa insertion sort. Kar me je pa najbolj presenetilo, je izjemno majhno število primerjav in prirejanj za selection sort. Tu so npr. podatki za tabelo 100 elementov:

bubblesort
primerjave: 2362
prirejanja: 7086
bubblesort: 0.000037

selectsort
primerjave: 316
prirejanja: 712
selectsort: 0.000024

insertsort
primerjave: 4724
prirejanja: 5021
insertsort: 0.000014


Kako to, da ima insertion sort desetkrat več primerjav in prirejanj, pa uredi tabelo prej kot selection sort? Podobne rezultate sem dobil tudi pri velikosti 10000 elementov in več.

FrEaKmAn ::

1. Lahko pokažeš implementacije?
2. Kakšne elemente imaš? Random?

Gregor5816 ::

Elementi so random:
for(i = 0; i < n; i++) {
	int x = rand() % 20000000;
	arr0[i] = x;
	arr1[i] = x;
	arr2[i] = x;
}


Bubblesort:
void bubblesort(int *a, int n) {
	int primerjave = 0;
	int prirejanja = 0;
	int i,j;

	for(i = n-1; i > 0; i--) {			// skozi tabelo of zadaj naprej
		for(j = 0; j <= i; j++) {		// od začetka do meje z neurejenim delom
			if(a[j] > a[j+1]) {		// če je x večji od naslednjega ju obrnemo
				primerjave++;

				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
				prirejanja += 3;
			}
		}
	}
	printf("bubblesort\nprimerjave: %d\nprirejanja: %d\n", primerjave,prirejanja);
}


Selection sort:
void selectsort(int *a, int n) {
	int primerjave = 0;
	int prirejanja = 0;
	int i,j;

	for(i = 0; i < n-1; i++) {
		int min = i;
		prirejanja++;
		for(j = i+1; j < n; j++) {
			if(a[j] < a[min]) {
				primerjave++;

				min = j;
				prirejanja++;
			}
		}
		int tmp = a[min];
		a[min] = a[i];	
		a[i] = tmp;
		prirejanja += 3;
	}
	printf("selectsort\nprimerjave: %d\nprirejanja: %d\n", primerjave,prirejanja);
}


Insertion sort:
void insertsort(int *a, int n) {
	int primerjave = 0;
	int prirejanja = 0;
	int i;

	for(i = 1; i < n; i++) {	
		int v = a[i];	
		int j = i-1;	
		prirejanja += 2;

		while((j >= 0) && (a[j] > v)) {		
			primerjave += 2;

			a[j+1] = a[j];		
			j--;
			prirejanja += 2;
		}
		a[j+1] = v;
		prirejanja++;
	}
	printf("insertsort\nprimerjave: %d\nprirejanja: %d\n", primerjave,prirejanja);
}


Za merjenje časa imam takole:
clock_t start = clock();
bubblesort(arr0,n);
clock_t end = clock();
double seconds = (double)(end - start) / CLOCKS_PER_SEC;
printf("bubblesort: %f\n",seconds);

SimplyMiha ::

Premisli, kdaj inkrementirati števce, sploh za primerjave. Ti inkrementiraš primerjave samo tam, kjer je if stavek za primerjavo resničen.

Daj izven teh checkov.

Zgodovina sprememb…

Gregor5816 ::

Pa res, sedaj dobim bolj smiselne (pričakovane) rezultate. Hvala.

lebdim ::

@Gregor5816,

sicer si pa lahko pomagaš s temle, ali pa tukaj, glede na to, da profesor vse razloži in pokaže implementacije. Mogoče se pa še kaj novega naučiš... :D

Sicer se pa nauči osnovnih idej, kaj kateri sort naredi. Poslušaj najprej teorijo, ki jo predava profesor in potem pomisli, na kakšen način bi sprogramiral zadevo. Čeprav meni kot profesorju za računalništvo je bolj važno razumevanje samega koncepta različnih urejanj (insertion sort, bubble sort, quick sort, merge sort, shell sort, selection sort, ......) kot pa programiranje le-teh.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Kako vrniti NULL če je polje prazno

Oddelek: Programiranje
271662 (1179) Matic1911
»

[C++] Insertion sort - problem

Oddelek: Programiranje
191035 (874) Thomas
»

[JavaScript] Sortiranje šumnikov

Oddelek: Programiranje
152004 (1738) MarkookraM
»

[Java] Sortiranje objektov

Oddelek: Programiranje
192709 (2709) tjaz24
»

sortirni algoritem v Cju

Oddelek: Programiranje
61363 (1215) GaPe

Več podobnih tem