《挑战程序设计竞赛》阅读笔记二 之 ALDS1_2_D Shell Sort
第三章 Sort I
ALDS1_2_D Shell Sort
这道题目,有一些看起来比较高端的东西,比如vector,实际上,就是一动态数组的作用,然后就是具体排序,实际上就是加了一个步长g,将原来的1改成g,在原来的插入排序的基础上面稍作修改就好。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
long long cnt;
int l;
int A[1000000];
int n;
vector<int> 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){
for(int h=1;;){
if(h>n)break;
G.push_back(h);
h=3*h+1;
}
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++) cin>>A[i];
cnt=0;
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;
}