Я, наконец, закончил доморощенную версию быстрой сортировки, чтобы отсортировать массив структур по элементу char.Причина, по которой я не использую stdlib qsort, заключается в том, что на супербыстрой машине это занимает более 5 минут.
У меня 12 физических и 24 логических ядра (двойной xeon 5690) и 192 ГБ (да, ГБ, а не МБ) оперативной памяти, поэтому я подумал, что смогу использовать это, написав многопоточную версию быстрой сортировки.Но я получаю исключение переполнения стека, предположительно из-за структуры s_stream, которая создается в стеке с каждой рекурсией.У меня есть более 2 400 000 строк для сортировки, поэтому я могу только представить, насколько глубокой должна быть рекурсия (если глубокий - правильный термин).
Я не могу реально уменьшить структуру.Должен ли я просто отказаться от этого и искать другой алгоритм сортировки?Если да, то какой?
struct s_stream {
char name[100];
int avg;
int current;
int currentY;
int marrayIndex;
int xy[2500];
int zz[2500];
}
void quickSort(struct s_stream items[], int left, int right)
{
int i, j;
struct s_stream temp;
i = left;
j = right;
temp = items[(left+right)/2];
do {
while((strcmp(items[i].name, temp.name) < 0) && (i < right)) { i++; }
while((strcmp(items[j].name, temp.name) > 0) && (j > left)) { j--; }
if(i <= j)
{
temp = items[i];
items[i] = items[j];
items[j] = temp;
i++;
j--;
}
} while(i <= j);
#pragma omp parallel sections
{
#pragma omp section
if(left < j) { quickSort(items, left, j);}
#pragma omp section
if(i < right) { quickSort(items, i, right); }
}
}