Одна потенциальная проблема - эта строка:
sort(0, high);
Рекурсивные вызовы всегда должны быть как минимум на один узел меньше, чем sort (lo, hi). Могут быть и другие проблемы.
Предполагая, что это присвоение класса, я не уверен, почему быстрая сортировка была выбрана в качестве метода для сортировки связанного списка, когда сортировка слиянием обычно используется. Существует также выбор «сортировки» связанного списка путем переупорядочения данных в узлах, а не сортировки путем переупорядочения узлов в связанном списке. Поскольку в вопросе не указаны требования к назначению, я не могу быть уверен, что цель здесь.
Использование индексации для связанного списка неэффективно. Вы можете использовать быструю сортировку на основе указателя, например:
void QuickSort(stu * lo, stu * hi);
Вот вариант схемы разбиения Lomuto, который можно преобразовать для сортировки связанного списка, в который будут преобразованы lo, hi, i, j, k на указатели на узел.
void QuickSort(int a[], int lo, int hi);
void QuickSort(int a[])
{
int lo = 0;
int hi = sizeof(a)/sizeof(a[0])-1;
if(lo >= hi)
return;
QuickSort(a, lo, hi);
}
void QuickSort(int a[], int lo, int hi)
{
int p = a[lo];
int i = lo;
int j = lo;
int k;
for(k = lo+1; k <= hi; k++){
if(a[k] < p){
j = i++;
std::swap(a[k], a[i]);
}
}
std::swap(a[i], a[lo]);
if(j != lo)
QuickSort(a, lo, j);
if(i != hi)
QuickSort(a, i+1, hi);
}
Можно также рассмотреть метод, подобный быстрой сортировке, который создает 3 списка с каждым уровнем рекурсии, сортируя узлы вместо обмена данными. 3 списка будут узлами pivot. Рекурсия будет использоваться в 2 списках с узлами! = Pivot, тогда эти 3 списка будут объединены.