#include<iostream>
#include <vector>
using namespace std;
/*
* 希爾排序思路:
* 1. 選擇增量進行分組
* 2. 在每組內進行插入排序
* 3. 縮小增量再執行1、2,直到增量爲1(增量爲1時也要在執行一次)
*/
long long cnt;
int a[1000001];
int n;
vector<int> G;
// 間隔爲g的插入排序
void insertionSort(int a[], int n, int g){
for (int i = g; i < n; i++){
int v = a[i];
int j = i - g;
while(j >= 0 && a[j] > v){// 在每個分組內,進行插入排序
a[j+g] = a[j];
j -= g;
cnt++;
}
a[j+g] = v;
}
}
void shellSort(int a[], int n){
// 生成間隔數列G
int h = 1;
while(h <= n){
G.push_back(h);
h = 3*h+1;
}
// 指定插入間隔g = G[i]
for (int i = G.size()-1; i >= 0; i--){
insertionSort(a, n, G[i]);
}
}
int main(){
cin>>n;
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
cnt = 0;
shellSort(a, n);
cout<<G.size()<<endl;
for (int i = G.size()-1; i >= 0; i--){
if (i != 0){
printf("%d ", G[i]);
}else{
printf("%d\n", G[i]);
}
}
printf("%d\n", cnt);
for (int i = 0; i < n; i++){
printf("%d\n", a[i]);
}
return 0;
}
ALDS1_2_D:ShellSort
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.