Zamiana elementów

dział ogólny

Zamiana elementów

Nowy postprzez Subgard » wtorek, 16 marca 2010, 21:07

Nie zauważyłem, aby był podobny temat. Sprawa wydaje mi się banalna, ale mam jakieś zaciemnienie ;D Pytanie stawiam takie: Jak bezpośrednio uzyskać w najlepszym czasie zamianę dwóch elementów. Czy zamiana z użyciem wskaźników będzie najszybsza? Coś w stylu:
int t=*p;
*p=*k;
*k=t;

Może wykorzystanie jakiejś zmiennej do zapisu pierwszego elementu, po czym na miejsce pierwszego wpisanie drugiego, a zapamiętaną liczbę na drugą. Czyli prawie to samo, ale bez wskaźników? Jakie jest optymalnie czasowo rozwiązanie? Ja nie jestem pewny, więc wole się upewnić i zapytać ;)
Avatar użytkownika
Subgard
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): wtorek, 16 marca 2010, 20:53
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamiana elementów

Nowy postprzez Cyfrowy Baron » wtorek, 16 marca 2010, 22:48

...a ja nie rozumiem!

Może zamiast spekulować napisz wprost co chcesz osiągnąć, zrobić.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamiana elementów

Nowy postprzez Subgard » Å›roda, 17 marca 2010, 08:32

Generalnie mam polecenie znalezienia najszybszego sposobu do zamiany dwóch danych miejscami z sobą nawzajem, przy czym nie musi to być tablica. Najprostsze wydaje się stworzenie trzech zmiennych a,b,c i zrobienie tego tak:

int a,b,c;
a=b; //zapisanie liczby a
a=c; //zapisanie do liczby a wartości c
c=b; //zapisanie do c liczby wcześniej skopiowanej, czyli b

To samo można zrobić ze wskaźnikami. Właściwie wydaje się, że wskaźniki będą bardziej optymalne. Tylko czy najszybsze?
Avatar użytkownika
Subgard
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): wtorek, 16 marca 2010, 20:53
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamiana elementów

Nowy postprzez Cyfrowy Baron » Å›roda, 17 marca 2010, 10:11

W podanym przykładzie zmienne b i c należy wcześniej wypełnić wartościami, a może być puste, gdyż najpierw przyjmuje wartość zmiennej b: a = b; wiec b musi posiadać jakaś wartość. Potem przyjmuje wartość zmiennej c: a = c; więc c musi posiadać jakąś wartość. Następnie następuje wymiana wartości zapisanej w zmiennej c na wartość zmiennej b: c = b; więc b musi posiadać jakąś wartość. Zmienna a nigdy nie jest używana. Wartość zmiennej b nie ulega zmianie.

Dla tego przykładu stosowanie wskaźników niczego nie wnosi, gdyż mamy tutaj zwykłą wymianę wartości między zmiennymi. Ostateczny wynik to wszystkie zmienne przechowują wartość zmiennej b, więc można to zapisać tak:

Kod: Zaznacz cały
  int a, b = 10, c = 25;

  a = b = c = b;


Ten zapis daje taki sam wynik, ale przebieg jest inny:

c = b;
b = c;
a = b;



Kod: Zaznacz cały
int t=*p;
*p=*k;
*k=t;


Takie zapisy są nieprawidłowe. Powinno być raczej coś takiego:

Kod: Zaznacz cały
int t = 10, p, *k;

k = &t; /* wskaźnik typu int 'k' wskazuje na obszar pamiÄ™ci zajmowany przez zmiennÄ… 't'  */
p = *k;  /* zmiennej 'p' zostaje przypisana wartość spod adresu wskazywanego przez 'k'  */


Jest to bardziej optymalne niż przepisywanie wartości z jednej zmiennej do drugiej, więc i szybsze.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości