Я прочитал источники, которые говорят, что временные сложности для выбора рода являются:Оптимизированный выбор Сортировка?
- Лучший случая: O (N^2)
- Средне-случай: O (N^2)
- Худшая -случае: O (N^2)
было интересно, если это стоит «оптимизировать» алгоритм, добавив определенную строку кода, чтобы сделать алгоритм «короткое замыкание» само по себе, если оставшаяся часть уже отсортирована.
Вот код, написанный на C:
Я также добавил комментарий, который указывает, какие строки являются частью «оптимизации» части.
void printList(int* num, int numElements)
{
int i;
for(i = 0; i < numElements; i ++) {
printf("%d ", *(num + i));
}
printf("\n");
}
int main() {
int numElements = 0, i = 0, j = 0, min = 0, swap = 0, numSorted = 0;
printf("Enter number of elements: ");
scanf("%d", &numElements);
int* num = malloc(sizeof(int) * numElements);
for(i = 0; i < numElements; i ++) {
printf("Enter number = ");
scanf(" %d", num + i);
}
for(i = 0; i < numElements-1; i++) {
numSorted = i + 1; // "optimized"
min = i;
for(j = i + 1; j < numElements; j++) {
numSorted += *(num + j - 1) <= *(num + j); // "optimized"
if(*(num + min) > *(num + j))
min = j;
}
if (numSorted == numElements) // "optimized"
break;
if (min != i) {
swap = *(num + i);
*(num + i) = *(num + min);
*(num + min) = swap;
}
printList(num, numElements);
}
printf("Sorted list:\n");
printList(num, numElements);
free(num);
getch();
return 0;
}
Я получаю вашу точку зрения, но «оптимизация» (если она есть), которую мне любопытно, предназначена для «короткого замыкания» итерации сортировки. Рассмотрим пример 1, 2, 3, 4, 5. В регулярном сортировочном сортировании шаг за шагом будет делать 1, 2, 3, 4, 5 - 1, 2, 3, 4, 5 - 1, 2, 3, 4, 5 - 1, 2, 3, 4, 5. В коде, который я представил, он просто перейдет 1, 2, 3, 4, 5 - break. – CudoX
Правильно, но как часто это произойдет? Это дополнительные накладные расходы по уже очень медленному алгоритму и только преимущество в крайне редком случае, когда список уже отсортирован. Если ваш случай использования находится где-то, где список часто уже отсортирован или почти отсортирован, используйте алгоритм сортировки, такой как сортировка вставки, которая позаботится об этом естественным образом (и в качестве бонуса также хороша при сортировке почти отсортированных списков). – Chris