Shell Sort is a generalization of?Insertion Sort?to arrange a list of?nn?elements?AA.
1 insertionSort(A, n, g)
2 for i = g to n-1
3 v = A[i]
4 j = i - g
5 while j >= 0 && A[j] > v
6 A[j+g] = A[j]
7 j = j - g
8 cnt++
9 A[j+g] = v
10
11 shellSort(A, n)
12 cnt = 0
13 m = ?
14 G[] = {?, ?,..., ?}
15 for i = 0 to m-1
16 insertionSort(A, n, G[i])
A function shellSort(A, n) performs a function insertionSort(A, n, g), which considers every?gg-th elements. Beginning with large values of?gg, it repeats the insertion sort with smaller?gg.
Your task is to complete the above program by filling??. Write a program which reads an integer?nn?and a sequence?AA, and prints?mm,?Gi(i=0,1,...,m?1)Gi(i=0,1,...,m?1)?in the pseudo code and the sequence?AA?in ascending order. The output of your program must meet the following requirements:
- 1≤m≤1001≤m≤100
- 0≤Gi≤n0≤Gi≤n
- cnt?does not exceed??n1.5??n1.5?
Input
In the first line, an integer?nn?is given. In the following?nn?lines,?Ai(i=0,1,...,n?1)Ai(i=0,1,...,n?1)?are given for each line.
Output
In the first line, print an integer?mm. In the second line, print?mm?integers?Gi(i=0,1,...,m?1)Gi(i=0,1,...,m?1)?separated by single space character in a line. In the third line, print?cnt?in a line. In the following?nn?lines, print?Ai(i=0,1,...,n?1)Ai(i=0,1,...,n?1)?respectively.
This problem has multiple solutions and the judge will be performed by a special validator.
Constraints
- 1≤n≤1,000,0001≤n≤1,000,000
- 0≤Ai≤1090≤Ai≤109
Sample Input 1
5
5
1
4
3
2
Sample Output 1
2
4 1
3
1
2
3
4
5
Sample Input 2
3
3
2
1
Sample Output 2
1
1
3
1
2
3
解题思路:输出的解读(1)输出分组的次数? ?(2)每次分组的步长? (3)交换次数? ?(4)排序后的数
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e6+10;
int a[N],cnt;
vector<int> G;
void shellsort(int a[],int n){
for(int h=1;h<=n;h=3*h+1) G.push_back(h); //存储划分的步长值
for(int k=G.size()-1;k>=0;k--){ //取每个步长值
int g=G[k]; //读取步长值
for(int i=g;i<n;i++){ //插入排序
for(int j=i;j>=g && a[j]<a[j-g];j-=g){
swap(a[j],a[j-g]);
cnt++;
}
}
}
return;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
shellsort(a,n);
cout<<G.size()<<endl; //输出分组的次数
for(int i=G.size()-1;i>=0;i--){ //每次分组的步长
cout<<G[i];
if(i) cout<<" ";
}
cout<<endl;
cout<<cnt<<endl;
for(int i=0;i<n;i++) cout<<a[i]<<endl;
return 0;
}
|