sorting — сортировка оболочки в C ++ с использованием последовательности пробелов Ciura

У меня было задание для класса, и я получил этот код, но я не совсем уверен, правильно ли я это сделал, и хотел бы получить информацию от любого, кто разбирается в этой проблеме.
Он назначил нам «типичный» файл сортировки оболочки здесь.

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;template <typename Comparable>
unsigned long shellsort( vector<Comparable> & a )
{
unsigned long counter = 0;

for( unsigned int gap = a.size( ) / 2; gap > 0; gap /= 2 )
for( unsigned int i = gap; i < a.size( ); i++ )
{
Comparable tmp = a[ i ];
unsigned int j = i;

for( ; j >= gap ; j -= gap )
{
counter++;
if (!(tmp < a[ j - gap ])) break;
a[ j ] = a[ j - gap ];
}

a[ j ] = tmp;
}

return counter;
}

const int N = 10000;

int main ()
{
vector<int> rnumbers;
clock_t start, finish;
double duration;

srand(42);
start = clock();

cout << "Sorting " << N << " numbers." << endl;

for (int i=0; i<N; i++)
rnumbers.push_back (rand ());

finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;

cout << "Initializing vector: " << duration << " seconds." << endl;

start = clock();

unsigned long comp = shellsort (rnumbers);

finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;

cout << "Sorting vector: " << duration << " seconds." << endl;
cout << "Number of comparisons: " << comp << endl;

return 0;
}

и затем нам пришлось использовать модифицированный код, чтобы приспособить различные последовательности пробелов, которые являются оптимальными последовательностями пробелов Ciura, а затем вычислить числа дальше, но менее 1 миллиона, используя формулу.

int c[] = {510774, 227011, 100894, 44842, 19930, 8858, 3937, 1750, 701, 301, 132, 57, 23, 10, 4, 1};

Он сказал изменить код, поэтому я изменил только эту часть.

  unsigned long counter = 0;
int x=0;
int c[16] = {510774, 227011, 100894, 44842, 19930, 8858, 3937, 1750, 701, 301, 132, 57, 23, 10, 4, 1};
for( unsigned int gap = c[x]; gap > 0; gap /= 2 )
{
x++;
for( unsigned int i = gap; i < a.size( ); i++ )
{

Я все еще сортирую и не имею ошибок, но я не могу помочь, но думаю, что, изменив код, как я сделал, я действительно не достиг ничего, что он уже делал раньше.

если бы кто-нибудь мог мне помочь, я был бы очень признателен.

Заранее спасибо.

0

Решение

Вместо вычисления следующего значения разрыва, делая gap /= 2 Вы должны перебирать последовательность Ciura и использовать каждое значение в свою очередь как gap, Так что вместо того, чтобы делать:

for( unsigned int gap = c[x]; gap > 0; gap /= 2 )

Попробуйте что-то вроде:

for( int x = 0; x < 16; ++x )
{
unsigned int gap = c[x];
...
0

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


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