2012-02-17 12 views
8

Wdrażam wersję sortowania scalania w c. W pierwszym kroku muszę podzielić tablicę na pod-tablice.Czy źle jest dzielić tablicę C, po prostu za pomocą wskaźnika do jej środka?

Czy to jest zła praktyka po prostu zrobić to, mając dwa wskaźniki, jeden wskazuje na początek oryginalnej tablicy, a drugi wskazuje na środek?

Czy powinienem zaadaptować 2 nowe gniazda pamięci, skopiować odpowiednie wartości tutaj, a następnie pozostawić wskaźnik do tego miejsca?

Odpowiedz

12

Nie sądzę, że to jest zła praktyka, jeśli wiesz, co robisz. W niektórych przypadkach poświęcasz czytelność dla wydajności. Prawdopodobnie po prostu utworzysz dwie dodatkowe tablice, ale jeśli dobrze znasz tablice i wskaźniki, po co alokować dodatkową pamięć?

+6

Z drugiej strony, robienie czegokolwiek w C, jeśli nie wiesz, co robisz, to zła praktyka. –

+0

@WilliamPursell :) chyba że użyjesz 'printf' bez parametrów variadic. Ten jest całkiem łatwy. –

+2

@LuchianGrigore, masz na myśli 'printf ("% s \ n ");'? – ugoren

2

W takim przypadku wystarczy użyć jednej tablicy (jako sortowanie scalone). Nazwanie malloc jest niepotrzebne, chyba że rozmiar tablicy jest zbyt duży dla stosu.

11

Absolutnie nie! Cały punkt programowania w C jest w stanie wykonać te zgrabne sztuczki wskaźnikowe!

Należy jednak pamiętać, że mergesort nie jest na miejscu, więc nadal będziesz potrzebować malloc tablicy pomocniczej. Jeśli zrobisz poprawne sztuczki pointeru, możesz je po prostu zaimprowizować i użyć ponownie.

2

Generalnie przy sortowaniu scalonym należy umieścić wynik scalenia w pamięci zajmowanej przez oryginalne wejście. Jeśli tak, to należy:

  • rodzaj obie połówki
  • kopiować „niższej” połowę swojej tablicy na nowo przydzielonego buforu, pozostaw „górny” pół gdzie jest
  • scalania z "górna" połowa i dodatkowy bufor, do "dołu" dużej tablicy.

W ten sposób wystarczy przydzielić tyle pamięci, ile wynosi pół wielkości wejścia. Możesz to zrobić nawet raz na początku i ponownie użyć tego samego bufora, co przestrzeń robocza dla wszystkich scaleń, które zamierzasz wykonać.

1

Nie, to nie jest złe, a tak naprawdę twierdzę, że jest to jeden z jedynych powodów używania C na pierwszym miejscu. Jeśli masz zamiar robić marnotrawne kopie danych za każdym razem, gdy trzeba traktować te same dane nieco inaczej, już wywołałeś jeden z największych kosztów języków skryptowych wysokiego poziomu. Drastycznie zwiększyłeś także ilość błędów, jakie musi wykonać twój kod (ponieważ alokacja może się nie powieść), a ponieważ obsługa błędów w C jest nieco "pełna" (mówiąc uprzejmie), koszt złożoności netto jest znacznie gorszy niż niewielki złożony koszt dostępu do podstrumieni w miejscu.