Может быть, сам алгоритм не так неясен, но кто может назвать реализацию, которая фактически используется на практике? Я могу!
TIGCC (компилятор на основе GCC для графических калькуляторов TI-89/92 / V200) использует сортировку Shell для qsort
реализации в своей стандартной библиотеке:
__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
unsigned short gap,byte_gap,i,j;
char *p,*a,*b,temp;
for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1) // Yes, this is not a quicksort,
{ // but works fast enough...
byte_gap=gap*(unsigned short)size;
for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
{
a=p; b=p+byte_gap;
if(cmp_func(a,b)<=0) break;
for(j=size;j;j--)
temp=*a, *a++=*b, *b++=temp;
}
}
}
Сортировка оболочки была выбрана в пользу быстрой сортировки, чтобы размер кода был низким. Хотя асимптотическая сложность еще хуже, TI-89 не имеет большого объема ОЗУ (190 Кбайт, за вычетом размера программы и общего размера любых неархивированных переменных), поэтому можно с уверенностью предположить, что количество элементов будет быть низким.
Более быстрая реализация была написана после того, как я пожаловался, что она слишком медленная в написанной мной программе. Он использует лучшие размеры зазоров, наряду с оптимизацией сборки. Его можно найти здесь: qsort.c