Šta je novo?

Алгоритам за сортирање низа у програмсмо

ZeeGerman

Čuven
Učlanjen(a)
05.01.2002
Poruke
2,540
Poena
725
Moja oprema  
CPU & Cooler
AMD Ryzen 7 7800X3D & DeepCool LS720 WH
Matična ploča
Gigabyte AORUS Elite AX ICE AMD B650
RAM
32GB Corsair Vengeance DDR5-6000 CL30
GPU
PowerColor 7800 XT Hellhound Spectral White
Storage
Samsung 980 PRO 1TB & 2x500GB SSDs
Zvuk
on board
PSU
THERMALTAKE Toughpower GF A3 Snow 850W
Kućište
Lian Li O11 Dynamic EVO RGB
Monitor
DELL 27" VA S2722DGM
Miš & tastatura
Logitech MX Master 3S & Genesis Thor 303
Ostale periferije
Synology DS 220+
Laptop
DELL Latitude 5410
Tablet
Samsung Galaxy Tab S7+
Mobilni telefon
Honor Magic6 Pro
Pametni uređaji
Usisivač!? Jesam učestvovao u diskusiji, ali baš da koristim tako nešto.... :D
Pristup internetu
  1. Optički internet
Алгоритам за сортирање низа у програмсмо

Да ли је овај алгоритам добар, и ако јесте зашто ми онда не сортира низ како треба (најдебилнија ситница, низ од осам целих бројева)!?

for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a<a[j])
{
t=a;
a=a[j];
a[j]=t;
}
for(i=0;i<n;i++)
printf("\n %d", a);

Хвала!
 
Kako ne sortira?

Sortira niz (selection-sort) u opadajućem poretku.
 
zeleni_zub je napisao(la):
Kako ne sortira?

Sortira niz (selection-sort) u opadajućem poretku.


Немам појма, ни мени није јасно. :crash: Мора да ме компајлер нешто зеза, јер је програм прилично једноставан, али кад треба да ми прикаже сортиран низ, он ми прикаже прво минус, па онда неких осам бројева који немају везе са дотичним низом. Елем, пробаћу поново са неки другим кодом, или ћу једноставно да обрнем поредак у растући. Ово ми је било битно ( исправност алгоритма за сортирање ) :type: .

Хвала у сваком случају.
 
Poslednja izmena:
trebao si da kopiras ceo program, mozda si negde stavio koju * vishka, ili si nesto zeznuo. ajde kopiraj ovde ceo prog bas me kopka sta je :)
 
ZeeGerman je napisao(la):
али кад треба да ми прикаже сортиран низ, он ми прикаже прво минус, па онда неких осам бројева који немају везе са дотичним низом.

Možda ti a nije definisano. Ili možda nisi rezervisao memoriju za niz.

Daj ceo program.
 
U pitanju je ispitni zadatak sa VETŠ-a i izgleda ovako:

Napisati program koji:

a)prihvata sa tastature niz a od n elemenata (n<50) celih brojeva i prikazuje na ekranu redne brojeve prvog pojavljivanja najmanjeg elementa i poslednjeg pojavljivanja najvećeg elementa u nizu a;

b)formira i prikazuje na ekranu niz b od zadatog niza a, izostavljanjem svih elemenata između prvog pojavljivanja najmanjeg elementa i poslednjeg pojavljivanja najveceg elementa niza;

c)Sortira niz b u nerastući poredak i prikazuje na ekranu rezultujući niz

---------------------------------------------------------------------

O čemu se radi!? Ovaj algoritam za sortiranje mi nešto brljavi na poslu,
uporno javlja onaj minus što sam gore naveo, ali evo sada mi na računaru u kući radi kako treba (potpuno isti kod je u pitanju, čak sam snimio kod u txt faljl da bih izbegao neku sintaksnu ili bilo koju drugu grešku). Ipak, kad ste već tu, da li neko može da mi objasni šta mi je to pogrešno u drugom delu zadatka ( ono pod b) ).

---------------------------------------------------------------------

Evo kompletnog zadatka:

/* prvi deo */

#include <stdio.h>
#define MAX 50
main()
{
int a[MAX], b[MAX], i, j, n, t, max, min, imin, imax;
do
{
printf("\nUneti n ( maksimalna duzina niza x, n<50 )\n");
scanf("%d", &n);
}
while(n>50);
printf("\nUneti %d clanova za x niz: \n", n);
for(i=0;i<n;i++)
scanf("%d", &a);
max=min=a[0];
imin=imax=1;
for(i=1;i<n;i++)
{
if(a<min)
{
min=a;
imin=i+1;
}
if(a>max)
{
max=a;
imax=i+1;
}
}
printf("\nPrvi najmanji uneti clan niza je: %d", imin);
printf("\nPoslednji najveci uneti clan niza je: %d", imax);

/* drugi deo */

for(i=0;i<imin;i++)
for(j=i=0;i<n;i++)
if(i<imin || i>imax)
b[j++]=a;
printf("\nTrazeni niz je: \n\n");
for(i=0;i<j;i++)
printf("\t %d", b);

/* treci deo */

for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a<a[j])
{
t=a;
a=a[j];
a[j]=t;
}
for(i=0;i<n;i++)
printf("\n %d", a);
printf("\n\n");
}


P.S. Hvala !!! :wave: :smoke:
 
Umesto:

Kod:
for(i=1;i<n;i++)
 {
  if(a[i]<min)
   {
    min=a[i];
    imin=i+1;
   }
[B]  if(a[i]>max)
   {
    max=a[i];
    imax=i+1;
   }[/B] 
}

treba da stoji:

Kod:
if(a[i]>=max)
 {
   max=a[i];
   imax=i+1;
  }

Ovako kao što si ti napisao vraća poziciju prvog max. člana, a ne poslednjeg.

I drugi deo:

Kod:
/* drugi deo */
t=i=j=0;

while(i<imin-1) // kopira prvi deo niza (pre prvog minimalnog clana) u niz B isključujući najmanji član)
 b[t++]=a[i++]; 
while(i<imax) // preskače deo do poslednjeg najvećeg clana (uključujući najveći član)
 i++;
while(i<n)  // kopira ostatak niza u niz B
 b[t++]=a[i++];

printf("\n");
for(i=0;i<t;i++)   // ispisuje niz
 printf("%d ", b[i]);
 
Poslednja izmena:
Хвала батице. Е сад, извини што смарам, али ако могу још једну ствар да те питам. Како се разбија, тј. расчлањује int тип? Рецимо, преко тастатуре уносим неки цео број (вишецифрен) и од њега треба да направим низ, тј. од његовиг цифара. НПР, унео сам број 1894 (int), и треба да од њега направим и испишем на екрану низ Х који ће имати четири члана и то 1-8-9-4?

Хвала још једном и поз' :wave:
 
Mozes da delis broj sa 10 (bez ostatka, samo ceo deo) i posle ispises dobijeni niz unazad.
 
Не разумем? Јел те мрзи да напишеш како изгледа тај алгоритам?

Плиииииииииз!
 
Uh, treba da bude nesto ovako

const MAX=20;
int x, y, i, n=0;
int a[max];

(unesi broj x nekako)

while(x<>0) {
y=x mod 10;
n++;
a[n]=y;
x=x div 10
}

while (n>0) {
printf("%d ", a[n]);
n--
}

U osnovi to je ideja tj. jedan od nacina. Verovatno ima gresaka, ali mislim da ce ti pomoci da resis problem.

Pozdrav!
 
Kod:
#include "stdafx.h"
#include <stdio.h>


int _tmain(int argc, _TCHAR* argv[])
{
 unsigned long broj=0L;
 unsigned int cifre[10] = { 0,0,0,0,0,0,0,0,0,0 };
 int n=0,i,t;
 
 scanf("%lu",&broj);

 while(broj!=0)   // ubacuje cifre u niz obrnutim redosledom - počinje od cifre sa najmanjom težinom
  {
   cifre[n++]=broj%10;
   broj=broj/10;
  }

for(i=0;i<n/2;i++)  // invertuje niz da bi prva cifra (cifra[0]) bila cifra sa najvećom težinom
 {
  t=cifre[i]; cifre[i]=cifre[n-i-1]; cifre[n-i-1]=t;
 }

for(i=0;i<n;i++)  // ispisuje niz
 printf("%d ", cifre[i]);
printf("\n");


return 0;
}
 
SirOliver je napisao(la):
"Moze tako, a moze i ovako" :) :p

Isto je... samo sam mu lepo napisao u C-u, da ne mora ništa da ispravlja. ,)
 
Poslednja izmena:
const MAX=20;
int x, y, i, n=0;
int a[max];

(unesi broj x nekako)
n=0;
while(x!=0)
{
y=x%10;
a[n]=y;
n++;
x=x/10
}

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

ja sam ovako (na)ucio :D


U svakom slucaju, hvala vam momci, danas (ustvari juce) sam polagao ispit i ubedjen sam da sam polozio. :banana:
 
ZeeGerman je napisao(la):
ja sam ovako (na)ucio :D

Tako ti u niz ubacuje cifre od one sa najmanjom težinom do one sa najvećom. Drugim rečima, kada posle ispišeš cifre dobićeš invertovan broj.
 
SirOliver je napisao(la):
Nece stampati invertovan broj, jer se stampa u nazad ;)


Nisam pažljivo pročitao šta je napisao. Ovako mu ispisuje nešto bezveze pošto mu je n u prvom prolazu kroz petlju za jedan veće od indeksa poslednjeg člana niza. A ono n--; će se izvršiti samo jednom pošto se završi petlja.

Verovatno je mislio ovako
Kod:
...
n--;
for(i=0;i<=n;i++)
 {
  printf("%d ", a[n]);
  n--;
 }

}

Ali ni tako ne radi... Ispisaće mu samo pola niza.
 
Poslednja izmena:
Sad ja nisam citao sta je ZeeSvaba :) napisao. Ja sam ti odgovorio za ono sto sam JA napisao :)
Pozdrav!
 
Ма ок. Иначе, на брзака сам куцао па сам се зезнуо, наравно да сам подразумевао декрементирање унутар фор петље.
 
ZeeGerman je napisao(la):
Ма ок. Иначе, на брзака сам куцао па сам се зезнуо, наравно да сам подразумевао декрементирање унутар фор петље.

Neće ti ni tako raditi. Recimo da je n==10; dok i stigne do 5, n će se smanjiti na 5 i završiće se petlja. Tako da će ti ispisati samo prvu polovinu niza.
 
zeleni_zub je napisao(la):
Neće ti ni tako raditi. Recimo da je n==10; dok i stigne do 5, n će se smanjiti na 5 i završiće se petlja. Tako da će ti ispisati samo prvu polovinu niza.

Богами, мени је радио програм баш како треба. Ево, сад ћу да одем да видим ( имам сачуван код у тхт фајлу ) па ћу да видим где сам и шта сам погрешно прекуцао.

@thunderchase Нема резултата до понедељка, али убеђен сам да сам прошао, зависи од критеријума. Урадих два комплетна задатка, а стрингове нисам завршио, стим што онај први нисам БАШ дословце урадио како се тражило, међутим, знајући проф. Ђенић...ваљда је довољно :type:
 
Poslednja izmena:
Ja sam uradio samo drugi i početke prvog i trećeg :) . Znajući Ðenićku, ne verujem da je dovoljno :) ...
 
ZeeGerman je napisao(la):
Богами, мени је радио програм баш како треба. Ево, сад ћу да одем да видим ( имам сачуван код у тхт фајлу ) па ћу да видим где сам и шта сам погрешно прекуцао.

@thunderchase Нема резултата до понедељка, али убеђен сам да сам прошао, зависи од критеријума. Урадих два комплетна задатка, а стрингове нисам завршио, стим што онај први нисам БАШ дословце урадио како се тражило, међутим, знајући проф. Ђенић...ваљда је довољно :type:

Ево га:

#include <stdio.h>
#define MAX 20
main()
{
int x, y, i, n=0;
int a[MAX];
printf("\nUnesi x: ");
scanf("%d", &x);
n=0;
while(x!=0)
{
y=x%10;
a[n]=y;
n++;
x=x/10;
}
for(i=0;i<n;i++)
printf("%d ", a);
}
 
thunderchase je napisao(la):
Ja sam uradio samo drugi i početke prvog i trećeg :) . Znajući Ðenićku, ne verujem da je dovoljno :) ...

У ком кабинету си полагао? Ја сам био у 409. Код нас су циркулисала два минијатурна флеш драјва и ликови су се испреписивали ненормално. Ја сам дао мој други задатак ликовима, али мени нико ништа није имао да да, тј. нико није био урадио комплетан трећи задатак који је мени фалио/требао. Иначе, био сам друга група. А ти?
 
402. Sve sama vuna, ni laserski prenos podataka ne bi pomogao :) . I ja sam bio druga grupa. Čekaj, koje godine si ti upisao?
 
thunderchase je napisao(la):
402. Sve sama vuna, ni laserski prenos podataka ne bi pomogao :) . I ja sam bio druga grupa. Čekaj, koje godine si ti upisao?

2001. Ako положим ово и још један испит, уписујем 5. семестар. Иначе, ја сам ово слушао у другој години, а не у првој, какав је сад случај.
 
Vrh Dno