第三章 ALDS1_2_D:Shell Sort 希尔排序法

来源:互联网 发布:windows怎么重启tomcat 编辑:程序博客网 时间:2024/05/22 06:44

知识点

希尔排序法是基于插入排序法
每次以间隔为g的元素为对象进行的插入排序,然后不断缩小g,然后继续插入排序,直到g=1.

小结

时间复杂度是O(n1.25),空间复杂度为O(n),是不稳定排序。

问题链接

ALDS1_2_D:Shell Sort

问题内容

输出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;}