Problem z funkcją sortującą

0

Mam problem z taką oto funkcją sortującą tablicę:

 static void Sort(int[] array)
        {
            int n = array.Length;
            for (int i = 0; i < n - 1; i++)
            {
                int minIndex = i;
                for (int j = i + 1; j < n; j++)
                {
                    if (array[j] < array[minIndex])
                    {
                        minIndex = j;
                    }

                    int temp = array[minIndex];
                    array[minIndex] = array[i];
                    array[i] = temp;
                }
            }
        }

Otóż dla danych wejściowych np. 5 elementowej tablicy: {5, 4, 2, 3, 1}, funkcja zwraca {1, 3, 2, 4, 5} co jest oczywiście źle.
Poprawiłem ten program (bo jest z internetu) i zamiast deklarować zmienne minIndex i temp w pętlach, zrobiłem to przed nimi i teraz już działa:

static void Sort(int[] array)
        {
            int temp, minIndex;
            int n = array.Length;
            for (int i = 0; i < n - 1; i++)
            {
                minIndex = i;
                for (int j = i + 1; j < n; j++)
                {
                    if (array[j] < array[minIndex])
                    {
                        minIndex = j;
                    }

                    temp = array[minIndex];
                    array[minIndex] = array[i];
                    array[i] = temp;
                }
            }
        }

I tu pada moje pytanie. Czy ktoś może mi wyjaśnić czym się różni w tym przypadku jeżeli zadeklaruję zmienne tmp i minIndex w pętli a na zewnątrz? Bo tego nie rozumiem.

0

Zmienna zadeklarowana w pętli przestanie istnieć po wyjściu z pętli. Ale w tym przypadku to nie ma znaczenia bo i tak to sortowanie źle działa. Z tego co widzę chciałeś uzyskać sortowanie bąbelkowe.

int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 };

int temp = 0;

for (int write = 0; write < arr.Length; write++) {
    for (int sort = 0; sort < arr.Length - 1; sort++) {
        if (arr[sort] > arr[sort + 1]) {
            temp = arr[sort + 1];
            arr[sort + 1] = arr[sort];
            arr[sort] = temp;
        }
    }
}

for (int i = 0; i < arr.Length; i++)
    Console.Write(arr[i] + " ");

Console.ReadKey();

Pierwszy lepszy znaleziony, przerób sobie pod swoją metodę. Zamiana elementów miejscami powinna być w if'ie a nie za każdym razem

0

To akurat jest sortowanie przez scalanie. Wiem, że po wyjściu z pętli nie będę mógł użyć zmiennych, ale dalej nie rozumiem czemu pierwszy kod nie działa.

0

Miałem na myśli sortowanie przez wybieranie*

0
Złoty Szczur napisał(a):

Miałem na myśli sortowanie przez wybieranie*

Zgadza się, Ale to i tak nie działa nie ważne gdzie deklarujesz zmienne. Zamiana elementów powinna być w ifie.

http://www.algorytm.org/algorytmy-sortowania/sortowanie-przez-wymiane-wybor-selectionsort/select-1-cs.html

Te dodatkowe zmienne tylko mieszają niepotrzebnie. Operuj na i oraz j żebyś wiedział co zamieniasz. Oczywiście temp musi być do zamiany elementów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1