- #include <iostream>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- #define EQU(x) ((4 * (x) + 3) * (x) + 1)
- template <typename Type>
- struct Print
- {
- void operator ()(Type& item)
- {
- cout << item << '/t';
- }
- };
- void sort(int x[], int n)
- {
- int gap;
- int power2;
- int temp;
- int i;
- int j;
- power2 = log((-3.0 + sqrt(16.0 * n - 7.0)) / 8.0) / log(2.0);
- power2 = 1 << (power2 + 1);
- do
- {
- power2 >>= 1;
- gap = EQU(power2);
- for (i = gap; i < n; ++i)
- {
- temp = x[i];
- for (j = i - gap; j >= 0; j -= gap)
- {
- if (x[j] > temp)
- {
- x[j + gap] = x[j];
- }
- else
- {
- break;
- }
- }
- x[j + gap] = temp;
- }
- }while(gap > 1);
- }
- int main(int argc, char *argv[])
- {
- int x[10];
- for(int i = 0; i < 10; ++i)
- {
- x[i] = rand() % 100;
- }
- for_each(x, x + 10, Print<int>());
- cout << endl;
- sort(x, 10);
- for_each(x, x + 10, Print<int>());
- cout << endl;
- return 0;
- }