PDA

Prikaži potpunu verziju : C, od najmanjeg do najveceg


clzola
29.11.2010, 13:34
Zadatak je: Uneti n brojeva, i ispisati ih od najmanjeg ka najvecem.

Uspio sam da napisem da program nadje najmanji broj

#include <stdio.h>

int main()
{
int n, i, k;
int Min;

scanf("%d", &n);
int array[n]; // Niz unetih brojeva
int minmax[n]; // Niz brojeva poredjanih od najmanjeg ka najvecem

for(i=0; i<n; i++) {
scanf("%d", &array[i]);
}

Min = array[0];
for(k=0; k<n; k++) {
for(i=0; i<n; i++) {
if(Min > array[i]) {
Min = array[i];
}
}
minmax[k] = Min;
}

for(k=0; k<n; k++)
printf("\n%d\n", minmax[k]);

return 0;
}


Unesem za promenljivu n: 7
A zatim za niz array[n]: 4 2 5 6 8 1 3
Najmanji broj je 1.

Posle ovoga, na izlazu se ispise niz minmax[n] u kome bi trebalo da su brojevi poredjani od najmanjeg ka najvecem. Medjutim, ja na izlazu dobijem sve 1. Dobijem to zato sto moj algoritam gore trazi najmanji broj u unijetom nizu, i svaki put je to 1. Ne znam kako da mu kazem "nemoj vise da ispitujes 1" :/

Moze pomoc oko ovog? :D

Todors
29.11.2010, 13:56
Imaš na netu, gomilu sort algoritama. Ti samo izaberi jedan koji ti najviše odgovara.

clzola
29.11.2010, 18:36
Resio sam:

#include <stdio.h>

int main()
{
int n, i, j;
int Min;

scanf("%d", &n);
int array[n];

for(i=0; i<n; i++) {
scanf("%d", &array[i]);
}

for (i=0;i<n;i++) {
Min = array[i];

for(j=i-1;j>=0;j--) {
if (array[j]>Min) array[j+1]= array[j];
else break;
}

array[j+1]=Min;
}

for(i=0; i<n; i++) printf("%d ", array[i]);

printf("\n\n");
return 0;
}

voodoo_
29.11.2010, 19:49
Ovo ti je najlakši algoritam za sortiranje, takozvani Bubble Sort. Ne moraš stalno da tražiš minimum, samo zaređaš dve petlje kroz niz koje će da uporede svaki sa svakim elementom (doduše, preskočiće prvih "i" elemenata u drugoj petlji, jer su oni već sortirani u prethodnim prolazima prve petlje, pa da se ne gubi vreme).

int i, j, tmp;

for (i=0; i<n; i++)
for (j=i; j<n; j++)
if (array[i] > array[j]) {
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}


edit: a da, ovo tvoje je "preformulisani" Bubble Sort :) ali uglavnom to je to. Bubble Sort je inače jedan od najneefikasnijih algoritama za sortiranje, i jako je spor za velike nizove. Imaš ovde razne algoritme ako te interesuje: www.cs.usfca.edu/~peter/cs245/sorting.pdf

Geomaster
29.11.2010, 22:03
C ima i funkciju qsort(), koja automatski radi algoritam Quicksort za tebe.

U tvom slučaju bi se koristila ovako:

#include <stdlib.h>

// Funkcija koja upoređuje dva int-a, u obliku void* pokazivača, potrebna za funkciju
int uporedi(void* pokazivac1, void* pokazivac2)
{
int broj1 = *(int*)pokazivac1;
int broj2 = *(int*)pokazivac2;

return (broj1 - broj2);
}

...

// učitaš niz i elemente


qsort(array, n /* veličina niza */, sizeof(int) /* veličina svakog elementa */, &uporedi /* pokazivač ka funkciji */ );

// Sad je niz sortiran jako efikasnim algoritmom Quicksort, koji sortira u O(nlogn) vremenu
Znam da si već rešio, samo sam hteo da ti ukažem na ovu funkciju, koja znatno poboljšava brzinu u odnosu na Bubble sort.

clzola
30.11.2010, 0:32
Mada, bolje je uciti sam praviti te neke funkcije, nego koristiti nesto sto je vec gotovo.
Kako kaze moja profesorica programiranja: "E tu se lomi mozak, na te sitne cake" xD

Geomaster
30.11.2010, 0:33
Mada, bolje je uciti sam praviti te neke funkcije, nego koristiti nesto sto je vec gotovo.
Kako kaze moja profesorica programiranja: "E tu se lomi mozak, na te sitne cake" xD
Ako hoćeš sâm da je napišeš, proveri wiki (http://en.wikipedia.org/wiki/Quicksort) za Quicksort :)