【Aizu ALDS1_2_D --- Shell Sort】

【Aizu ALDS1_2_D --- Shell Sort】


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
const int MAXN = 1000005;
int arr[MAXN];
vector<int> v;
long long cnt=0;

void insert_sort(int n,int g)
{
    for(int i=g;i<n;i++)
    {
        int v = arr[i];
        int j=i-g;
        while(j>=0 && arr[j]>v)
        {
            arr[j+g]=arr[j];
            j-=g;
            cnt++;
        }
        arr[j+g]=v;
    }
}

void shell_sort(int n)
{
    cnt=0;
    int x=1;
    while(x<=n) v.push_back(x),x=3*x+1;
    int m=v.size();
    for(int i=m-1;i>=0;i--)
    {
        insert_sort(n,v[i]);
    }
}

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> arr[i];
    shell_sort(n);
    cout << v.size() << endl;
    for(int i=v.size()-1;i>=0;i--)
        cout << v[i] << (i==0?'\n':' ');
    cout << cnt << endl;
    for(int i=0;i<n;i++)
        cout << arr[i] << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章