第三章 ALDS1_2_D:Shell Sort 希爾排序法
阿新 • • 發佈:2018-12-24
知識點
希爾排序法是基於插入排序法
每次以間隔為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;
}