Во-первых, ваш код не компилируется.Когда я внес исправления для его компиляции (добавив stdio.h и определения для arr и i в main), он зациклился бесконечно, что он будет делать, если раздел начинается и заканчивается в центре.Вам нужно увеличивать и уменьшать до сравнений, а не после.Вы можете сделать это, начав с i = start-1 и j = end + 1 и изменив сначала свои внутренние циклы на увеличение или уменьшение, или вы можете оставить их как есть и просто сделать i ++ и j-- после перестановки -Я сделал это, и сортировка работает.
Обратите внимание, что ваш сводный выбор плох для уже отсортированных массивов;Вы действительно должны выбрать медиану из 3 или даже 9 значений.
PS Другие желательные оптимизации: 1) Переключитесь на сортировку вставки для небольших разделов - оптимальная точка отсечения зависит от машины.Другой подход состоит в том, чтобы не сортировать разделы ниже определенного размера, а затем выполнять сортировку вставкой по всему массиву после выполнения быстрой сортировки.Также возможно использовать heapsort вместо сортировки вставкой, если сделано тщательно;гугл интросорт.2) быстрая сортировка выполняет два рекурсивных вызова;устраните второй, установив start = part + 1 и зацикливание.3) Избегайте возможности переполнения стека, сначала быстро сортируя больший раздел.4) Исключите первый рекурсивный вызов, используя явный стек.5) Встроенный своп () и раздел ().6) Не беспокойтесь об этом и просто вызовите процедуру библиотеки qsort.: -)