2015-10-19 3 views
2

Я попытался реализовать псевдокод для сортировки гребня в wikipedia, но, похоже, он сортирует массив образцов, который я ему даю. Какие-нибудь советы?Выполнение сортировки гребенки не точно сортируется, C++

void combSort(int* list, int length) 
{ 
bool swapper; 
int gap = length; 
double shrink = 1.25; 
int temp; 
do{ 
    gap = (int) gap/shrink; 
    if (gap < 1) 
     gap = 1; 

    swapper = false; 
    for (int i=0;(i+gap)<length;i++){ 
     if (list[i] > list[i+gap]){ 
      swap(list[i],list[i+gap]); 
      swapper = true; 
     } 
    } 
} 
while ((gap > 1) && (swapper == true)); 
} 
+0

Если вы собираетесь использовать C++, почему бы не использовать контейнеры стандартной библиотеки, такие как 'std :: array' или' std :: vector' здесь? Здесь у вас есть код C. – tadman

+0

И если это C, функция подкачки, вероятно, не работает. Вам нужно пройти по ссылке, а не по значению. – AShelly

ответ

3

Согласно документу в Википедии, вы должны изменить последний предикат. Действительное решение:

void combSort(int* list, int length) 
{ 
    bool swapper; 
    int gap = length; 
    double shrink = 1.25; 
    int temp; 
    do { 
     gap = (int)gap/shrink; 
     if (gap < 1) 
      gap = 1; 

     swapper = false; 
     for (int i = 0; (i + gap)<length; i++) { 
      if (list[i] > list[i + gap]) { 
       swap(list[i], list[i + gap]); 
       swapper = true; 
      } 
     } 
    } while ((gap > 1) || (swapper == true)); 
} 

Измененная строка: в то время как ((разрыв> 1) || (Swapper == TRUE));

+0

Спасибо. Глядя на вики, мне не сразу показалось, что наличие обоих условий ложно, поскольку требование покинуть цикл потребует «или» вместо «и». –

Смежные вопросы