ALDS1_2_D:ShellSort

題目地址
希爾排序詳解
類似題目

#include<iostream>
#include <vector>
using namespace std;

/*
 * 希爾排序思路:
 * 1. 選擇增量進行分組
 * 2. 在每組內進行插入排序
 * 3. 縮小增量再執行1、2,直到增量爲1(增量爲1時也要在執行一次)
 */

long long cnt;
int a[1000001];
int n;
vector<int> G;

// 間隔爲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){
    // 生成間隔數列G
    int h = 1;
    while(h <= n){
        G.push_back(h);
        h = 3*h+1;
    }
    // 指定插入間隔g = G[i]
    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++){
        scanf("%d", &a[i]);
    }
    cnt = 0;
    shellSort(a, n);
    cout<<G.size()<<endl;

    for (int i = G.size()-1; i >= 0; i--){
        if (i != 0){
            printf("%d ", G[i]);
        }else{
            printf("%d\n", G[i]);
        }
    }
    printf("%d\n", cnt);
    for (int i = 0; i < n; i++){
        printf("%d\n", a[i]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章