1. 程式人生 > >第三章 ALDS1_2_D:Shell Sort 希爾排序法

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

知識點

希爾排序法是基於插入排序法
每次以間隔為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; }