知识点
希尔排序法是基于插入排序法
每次以间隔为g的元素为对象进行的插入排序,然后不断缩小g,然后继续插入排序,直到g=1.
小结
时间复杂度是 O(n1.25) ,空间复杂度为 O(n) ,是不稳定排序。
问题链接
问题内容
输出g的选择数量,然后输出g数组,然后输出交换次数,最后输出排序后的结果。
思路
根据数量n生成g数组,然后通过g数组逆序进行希尔排序
代码
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
//g数组
vector<int>G;
long long cnt;
int A[1000000 + 10];
// 间隔为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 i = G.size() - 1; i >= 0; i--) {
insertionSort(A, n, G[i]);
}
}
// 生成g数组
void getArray(int n) {
for (int h = 1; h <= n;) {
G.push_back(h);
h = 3 * h + 1;
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &A[i]);
getArray(n);
shellsort(A,n);
int len = G.size();
printf("%d\n", len);
for (int i = len - 1; i >= 0; i--)
printf("%d%c", G[i], i == 0 ? '\n' : ' ');
printf("%lld\n", cnt);
for (int i = 0; i < n; i++)
printf("%d\n", A[i]);
return 0;
}