ALDS1_2_D:Shell Sort
程序员文章站
2024-03-22 23:13:28
...
输入:数量n,n行数据
输出:数量m,m个Gi,交换次数cnt,n行希尔排序后的数据
以g为间隔对数据做插入排序
g从G中获取,为1,4,13,40,121......通项为gn=3g(n-1)+1
间隔从大到小取
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
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int cnt=0;
vector<int> G;
void insertsort(int A[],int n,int g){
for(int i = g; i<n;i++){
int temp=A[i],j=i-g;
while(j>=0&&A[j]>temp){
A[j+g]=A[j];
j-=g;
cnt++;
}
A[j+g]=temp;
}
return ;
}
void shellsort(int A[],int n){
//generate the G array
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--) insertsort(A,n,G[i]);
return ;
}
int main (){
int n ,A[1000010];
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&A[i]);
shellsort(A,n);
cout<<G.size()<<endl;
for(int i =G.size()-1;i>=0;i--){
printf("%d",G[i]);
if(i) printf(" ");
}
printf("\n%d\n",cnt);
for(int i =0;i<n;i++) printf("%d\n", A[i]);
return 0;
}
错点:
1.for(int i=G.size()-1;i>=0;i--) insertsort(A,n,G[i]); g间隔要从大到小取,否则直接取1没有意义。
Question 图?
上一篇: 《Java数据结构与算法》第2章——数组