Путаница со следующим кодом сортировки выбора

int i, j, t;

for (i = 0; i < n - 1 ; i++) {
    for (j = i + 1; j < n; j++) {
        if (a[i] > a[j]) {
            t = a[i]; 
            a[i] = a[j]; 
            a[j] = t;
        }
    }
}  

Мой вопрос, является ли приведенный выше код правильным выбором сортировки кода или нет? Я получил этот код из разных книг. Если это неверно, объясните, пожалуйста, почему.

2 ответа

На мой взгляд, вид, показанный в вопросе, является пузырьковой, а не выборочной.

Среди других фрагментов кода, которые я копил в своем архиве, у меня есть испытательный стенд для различных алгоритмов сортировки. Тестовый стенд включает в себя всплывающие подсказки, выбор, вставку и быструю сортировку, а также отслеживает сравнения и обмены.

Код для сортировки пузырьков и выбора сортировки:

static void selection_sort(Data a[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        int min = i;
        for (int j = i + 1; j < n; j++)
        {
            inc_comps();
            if (a[j] < a[min])
                min = j;
        }
        inc_comps();
        if (min != i)
            swap(&a[min], &a[i]);
    }
}

static void bubble_sort(Data a[], int n)
{
    for (int i = n - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            inc_comps();
            if (a[j] > a[j+1])
                swap(&a[j], &a[j+1]);
        }
    }
}

Сейчас я не помню, почему внешний цикл сортировки по пузырькам ведет обратный отсчет, а не вверх, но более важным моментом является то, что сортировка выбора заметно отличается от кода, показанного в вопросе, а код в вопросе соответствует пузырьковой сортировке. гораздо ближе.

Вы также можете найти в Википедии алгоритм сортировки, в котором описаны эти и многие другие алгоритмы, а также ссылки на различные источники информации о сортировке.

Испытательный стенд запускает разные алгоритмы с разными шаблонами данных для наборов данных разных размеров. Часть вывода предназначена для 10000 строк данных (тип int):

 Number             Filler    Sorter       Compares          Swaps             Time
  10000             Random     Quick         151583          88111 PASS    0.000593
  10000             Random    Bubble       49995000       24895500 PASS    0.143897
  10000             Random Insertion       24905489       24895500 PASS    0.028966
  10000             Random Selection       50004999           9986 PASS    0.040409
  10000          Ascending     Quick         151719          90480 PASS    0.000584
  10000          Ascending    Bubble       49995000       24876354 PASS    0.141219
  10000          Ascending Insertion       24886345       24876354 PASS    0.022601
  10000          Ascending Selection       50004999           9988 PASS    0.041173
  10000         Descending     Quick         119881          74247 PASS    0.000251
  10000         Descending    Bubble       49995000       49995000 PASS    0.081584
  10000         Descending Insertion       49995000       49995000 PASS    0.055118
  10000         Descending Selection       50004999           5000 PASS    0.050586
  10000 Forward Organ Pipe     Quick       25000000       25005000 PASS    0.034033
  10000 Forward Organ Pipe    Bubble       49995000       24995000 PASS    0.070633
  10000 Forward Organ Pipe Insertion       25004999       24995000 PASS    0.022398
  10000 Forward Organ Pipe Selection       50004999           9987 PASS    0.048300
  10000 Reverse Organ Pipe     Quick       25005002       16665004 PASS    0.025632
  10000 Reverse Organ Pipe    Bubble       49995000       24995000 PASS    0.064798
  10000 Reverse Organ Pipe Insertion       25000000       24995000 PASS    0.022568
  10000 Reverse Organ Pipe Selection       50004999           9886 PASS    0.053838
  10000            Uniform     Quick       49995000          19998 PASS    0.030855
  10000            Uniform    Bubble       49995000              0 PASS    0.038719
  10000            Uniform Insertion           9999              0 PASS    0.000021
  10000            Uniform Selection       50004999              0 PASS    0.041021

Как видно из данных, сортировка выбора оценивается хорошо по количеству свопов, которые она выполняет, но не так хорошо по количеству сравнений. Это дало бы вам возможность подтвердить мои наблюдения о том, что алгоритм в вопросе представляет собой пузырьковую сортировку, а не сортировку выбора.

Да, код правильный. В основном это займет дорого O(n^2) отсортировать массив в порядке возрастания.

На каждом шагу i [0..n-1]Вы помещаете наименьший элемент среди индексов [i..n-1] по указателю i,

Функция подкачки гарантирует, что вы постоянно помещаете меньшее значение из двух сравниваемых значений в i индекс.

Другие вопросы по тегам