C-ben szeretnék tömböt rendezni, mi a hiba a kódban?
Előre megadtam a tömb elemeit, ezt a tömböt szeretném rendezni. Sajnos még rendkívül kezdő vagyok. Valaki ki tudná javítani ezt, hogy tökéletesen lefusson?
#include <stdio.h>
#include <stdlib.h>
int main() {
int tomb [9]=
{9,8,7,6,5,4,3,2,1,0
};
int i,j,temp;
for(i=0; i<8;i++){
for(j=i+1; j<9;j++){
if tomb[i]<tomb[j] {
tomb[i]==temp;
tomb[i]==tomb[j];
tomb[j]==temp;
}
}
}
}
tomb[i]==temp;
tomb[i]==tomb[j];
tomb[j]==temp;
Te jó ég, teljesen értelmetlen amit ide írtál. Cserélni akarsz, az "==" operátor összehasonlít nem értékül ad, és a sorrend is rossz. Helyesen:
temp=tomb[i];
tomb[i]=tomb[j];
tomb[j]=temp;
temp==tomb[i];
tomb[i]==tomb[j];
tomb[j]==temp;
#2
Hopp, kopipaszta. :) == helyett = természetesen, ahogy #1 írta.
Köszönöm a javítást. A program végén (az utolsó } előtt) vissza kell térni valamivel, pl. return 1?
Nektek így lefut a kód?
#include <stdio.h>
#include <stdlib.h>
int IntComparatorAsc(const void* A, const void* B) {
.. int a = *((int*)A);
.. int b = *((int*)B);
.. return a-b;
}
int main() {
.. int Array[] = {5, 9, 7, 3, 8, 4, 6, 5, 2};
.. int ArrayLength = 9;
.. qsort(Array, ArrayLength, sizeof(int), IntComparatorAsc);
.. return EXIT_SUCCESS;
}
A standard C library-ben, azon belül is az stdlib.h-ban van erre már kész és hatékony megoldás, a qsort. 4 paramétere van:
void qsort(
.. Egy memóriacím, ami a tömböd első elemére mutat,
.. A tömb elemeinek száma,
.. Hány bájton fér el a tömb egy eleme,
.. Egy, a tömb két elemét összehasonlító függvény
);
Ahhoz, hogy ez bármilyen adattípuson működni tudjon, muszáj neki void*-ekkel dolgoznia. Továbbá, emiatt maga a qsort nem tudja megállapítani, hogy melyik elem van hamarabb a sorrendben. Éppen ezért kell megadni neki egy hasonlító függvényt, amely 3 lépésből áll:
int compar(const void* a, const void* b) {
.. 1) A két paramétert vissza kell alakítani arra az adattípusra, amit ténylegesen tárol a tömb
.. 2) Meghatározni, hogy melyik elem van előbb a sorban
.. 3) Visszaadni egy egész számot
}
A 3. lépésben leírt egész szám a következő értékek lehetnek:
- Egy negatív szám, ha a tömbben az "a" paraméter által mutatott adat van előbb
- Egy pozitív szám, ha a "b" paraméter által mutatott adat van előbb
- 0, ha a két adat megegyezik.
És sokkal hatékonyabban csinálja, mint amit te implementáltál (a neve gyorsrendezés, Quick sort). Annak a neve, ha jól emlékszem, buborékrendezés, angolul Bubble sort. Itt egy videó az algoritmusokról vizualizálva:
https://www.youtube.com/watch?v=kPRA0W1kECg
A tied 3:58-tól látszik, a Quick sort pedig 0:39-től. Figyeld meg, mennyi adaton mennyi ideig dolgoznak.
Egy kezdőnek aki az alapvető operátorok kapcsán is bizonytalan ne gyertek itt optimalizálási kérdésekkel. Másrészt ha valóban optimalizálnia kellene, akkor mérni kell a futásidőt és nem aszimptotikus elemzést végezni. A buborékrendezés 16 elem alatt a leggyorsabb választás.
A qsort használhatatlan egy kezdőnek, mert függvényt kell átadni és (void*)-ról kell cast-olni kész őrület.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!