Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » DJopek 21:20
 » rainy 21:19
 » bajbusek 21:19
 » Dexter 21:15
 » piotrszac 21:09
 » skalak23 21:05
 » Wedelek 21:00
 » metacom 20:59
 » Kilgor 20:55
 » wrrr 20:51
 » Draghmar 20:49
 » Kenjiro 20:39
 » Holyboy 20:39
 » Sherif 20:36
 » slanter 20:34
 » Star Ride 20:32
 » ekspert_I 20:31
 » Chan 20:27
 » Rafael_3D 20:24
 » rulezDC 20:24

 Dzisiaj przeczytano
 56835 postów,
 wczoraj 61370

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2026
A R C H I W A L N A   W I A D O M O Ś Ć
    

Do znających c/c++ - nie wiem co jest źle w programie :( , the_unicorn 22/10/03 21:12
Witajcie! Mam na jutro rano napisać program, który będzie sortował zawartość tablicy. Czyli użytkownik wprowadza np. 10 liczb a program za pomocą sortowania przez scalanie posortuje je i wyświetli w odpowiedniej kolejności. Udało mi się napisać to co poniżej, ale nie ukrywam, że w c dopiero zaczynam i być może błąd jest jakiś banalny. Z góry dziękuję za pomoc!

#include<stdio.h>
#include<stdlib.h>

int sortowanie(int tablica[], int lewy, int prawy);
int scalanie(int tablica[], int lewy, int srodek, int prawy);

int main()
{
int ilosc,i;
int tab_wpr[20];
int lewy,prawy;
printf("Program sosrtujacy.\n");

printf("Podaj ilosc liczb do posortowania.\n");
scanf("%d",&ilosc);

lewy=0;
prawy=ilosc;

printf("Podaj kolejno liczby.\n");
for(i=0; i<ilosc; i++)
scanf("%d",&tab_wpr[i]);
sortowanie(tab_wpr, lewy, prawy);
printf("%d",sortowanie);

return(0);
}


int sortowanie(int tablica[], int lewy, int prawy)
{
int w;
int srodek=(prawy+lewy)/2;
if (prawy-lewy>1)
{
sortowanie(tablica, lewy, srodek);
sortowanie(tablica, srodek+1, prawy);
w = scalanie(tablica, lewy, srodek, prawy);
}
return w;

}

int scalanie(int tablica[], int lewy, int srodek, int prawy)
{
int i=lewy,j=srodek,l=0;
int tab_temp[20];

while(i<=srodek && j<=prawy) {
if (tablica[i]<tablica[j])
tab_temp[l++]=tablica[i++];
else
tab_temp[l++]=tablica[j++];
}

while(i<=srodek)
tab_temp[l++]=tablica[i++];
for(i=0;i<j;i++)
tablica[i]=tab_temp[i];

return *tablica;

}

"The wisest is he who knows he
does not know"

  1. Poprawiłem część , maciusk 22/10/03 22:44
    Poprawiłem część z wyświetlaniem wyników ale masz też błąd w funkcji sortującej, w którą nie chce mi się zagłębiać.

    MSI 683dx

  2. ja dodam , atay 22/10/03 22:58
    ze jestem w trakcie czytania Symfoni C++ i tam bardzo odradzał przypisania w postaci:
    tab_temp[l++]=tablica[i++];
    ponieważ jak to powiedział "różne kompilatory różnie to interpretują", dlatego najlepiej jest wrzucić tu tylko jedną inkrementację, drugą gdzie indziej. Funkcja przyznam skomplikowana, także nie widzę sensu zagłębiania się, chyba ze w jakims stopniu wyjasnisz jak ma dzialac :)

    _- Atay -_

    1. jeśli chodzi o funkcję scalającą to, , the_unicorn 22/10/03 23:21
      ona ma dwie tablice - lewą i prawą, które są już posortowane przez funkcję sortującą. No i ona ma wybierać która liczba (tzn. z której talblicy) jest mniejsza i scalać ją w jedną tablicę tworząc w ten sposób jedną tablicę posortowaną. Jeśli skończy się któraś z połówek tablic (lewa lub prawa) to ma przepisać do nowej tablicy zawartość tej, która zawiera jeszcze liczby. A tak to jest wyjaśnione na jednej ze stron www:
      merge-sort
      Sortowanie przez scalanie opiera się na procedurze scalania dwóch ciągów rosnących. Najpierw wytłumaczę jak działa ta procedura scalania.

      Mamy dwa ciągi rosnące:

      1,2,3,3 oraz 2,7,7,11,14
      "Zrobimy" z nich jeden ciąg rosnący. W tym celu porównujemy kolejne elementy obu ciągów wstawiając do tablicy (z ciągiem stanowiącym wynik tej operacji) tą z porównywanych liczb, która jest mniejsza. Potem przesuwamy "indeks porównywania" w tym ciągu, z którego pobraliśmy liczbę.


      1,2,3,3 oraz 2,7,7,11,14
      * *
      Ponieważ 1<2, dopisujemy do trzeciego ciągu 1 i przesuwamy gwiazdkę w lewym ciągu o jedną pozycję.


      1,2,3,3 oraz 2,7,7,11,14
      * *
      trzeci ciąg: 1
      2=2, więc do trzeciego ciągu dopisujemy 2 i przesuwamy o pozycję gwiazdkę w lewym ciągu (np.).


      1,2,3,3 oraz 2,7,7,11,14
      * *
      trzeci ciąg: 1,2
      2<3, więc dopisujemy 2 i przesuwamy prawą gwiazdkę.


      1,2,3,3 oraz 2,7,7,11,14
      * *
      trzeci ciąg: 1,2,2
      3<7, więc dopisujemy 3 i przesuwamy lewą gwiazdkę.


      1,2,3,3 oraz 2,7,7,11,14
      * *
      trzeci ciąg: 1,2,2,3
      3<7, więc dopisujemy 3 i przesuwamy lewą gwiazdkę.


      1,2,3,3 oraz 2,7,7,11,14
      * *
      trzeci ciąg: 1,2,2,3,3
      Lewy ciąg się skończył, więc dopisujemy na koniec resztę prawego ciągu.


      1,2,3,3 oraz 2,7,7,11,14
      * *
      trzeci ciąg: 1,2,2,3,3,7,7,11,14
      No i mamy ciąg rosnący!

      Żeby wykorzystać scalanie do sortowania, trzeba napisać rekurencyjną procedurę, której parametrem jest wycinek ciągu do posortowania. Jeśli fragment ciągu ma tylko jeden element, to nic nie robimy (w końcu to jest już posortowane!). Ten ciąg dzielimy na dwie równe (albo w przybliżeniu równe) części i sortujemy każdą z nich (rekurencja!). Po tej operacji mamy więc dwa ciągi rosnące. Scalamy je.

      "The wisest is he who knows he
      does not know"

    
All rights reserved ® Copyright and Design 2001-2026, TwojePC.PL