sorting — сортировка псевдокода в коде C ++

# Sort an array a[0...n-1].
gaps = [701, 301, 132, 57, 23, 10, 4, 1]

foreach (gap in gaps)
# Do an insertion sort for each gap size.
for (i = gap; i < n; i += 1)
temp = a[i]
for (j = i; j >= gap and a[j - gap] > temp; j -= gap)
a[j] = a[j - gap]
a[j] = temp

это псевдокод в Википедия стр.
Я не уверен в этом, если мой код на С ++ верен в соответствии с этим. Вот мой код:

void shellSort(int *array, int array_size)
{
int e, i, j, temp;
for(e = 0; e < array_size; e++)
{
for( i = e; i < array_size; i++)
{
temp = array[i];
for( j = i; j >= e && array[j - e] > temp; j -= e)
{
array[j] = array[j-e];
}
array[j] = array[temp];
}

}
}

И вот мой тестовый код:

int main()
{
int sizes[9] = {9,3,5,7,1,0,6,2,4};
int size = 0;
shellSort(sizes,size);

for(int i=0;i<size;i++)
{
cout << sizes[i] << endl;
}

return 0;

}

но это ничего не показывает на экране.

0

Решение

Хорошо, давайте возьмем это сверху

void shellSort(int *array, int array_size)
{

Ваш код полностью пропустил необходимый массив пробелов

  const int gaps[] = {701, 301, 132, 57, 23, 10, 4, 1};
int e, i, j, temp;

Внешний цикл должен быть через промежутки, а не 0 для array_size

  for(e = 0; e < sizeof(gaps)/sizeof(int); ++e)
{
int gap = gaps[e];

Вам нужно использовать промежуток из массива промежутков во внутреннем цикле

      for( i = gap; i < array_size; ++i)
{
temp = array[i];
for( j = i; j >= gap && array[j - gap] > temp; j -= gap)
{
array[j] = array[j-gap];
}

Вам нужно сохранить временную базу обратно в массив

          array[j] = temp;
}

}
}

NB: у меня сейчас нет компилятора, поэтому я не проверял это, но думаю, что это правильно.

Также несколько незначительных моментов, это:

  int e, i, j, temp;

Это плохая практика, вместо этого объявляйте каждую переменную так, как вы ее используете, т.е. вместо этого сделайте следующее:

      for( int i = gap; i < array_size; ++i)
{
int temp = array[i];
2

Другие решения

По какой-то причине (без комментариев) мой первый ответ был удален (опечатка — вы установили размер 0, а не 9). Был вопрос, почему «на экране ничего не отображается». Если вы установите размер равным 0, что вы ожидаете от цикла for, когда он повторяется от 0 до < размер???

Прежде чем смотреть на алгоритм, ваши параметры должны быть правильными. Начни там. Если что-то теперь выводится на экран, СЕЙЧАС вы можете начать отладку алгоритма (если вывод был неправильным). Если вывод правильный, то ваш алгоритм, вероятно, в порядке.

Если я ошибаюсь по этому поводу, ПОЖАЛУЙСТА, ЗАПИШИТЕ КОММЕНТАРИЙ НА МОЙ ОТВЕТ. Не просто «удалить» это!?!

1

По вопросам рекламы [email protected]