📕 シェルソート.
📌シェルソートの特徴.
- ほぼ整列されたデータに対して高速に動作するという挿入ソートの特徴を活かす高速なアルゴリズム.
- 一定間隔離れた要素のみを対象とした挿入ソート.
📌シェルソートの手順.
一定間隔g{4,3,1}を用いたシェルソートは以下の通り.
#include <iostream>
#include <vector>
using namespace std;
long long cnt;
vector<int> G;
// 挿入ソート
void insertSort(int A[], int N, int g) {
// 間隔gを指定した挿入ソート.
for (int i = g; i < N; i++) {
int tmp = A[i];
int j = i - g;
while (j >= 0 && A[j] > tmp) {
A[j + g] = A[j];
j -= g;
cnt++;
}
A[j + g] = tmp;
}
}
// シェルソート
void shellSort(int A[], int N) {
// 数列Gを生成.
for (int h = 1; ; ) {
if (h > N) {
break;
}
G.push_back(h);
h = 3*h + 1;
}
// 逆順にG[i]=gを指定.
for (int i = G.size()-1; i >= 0; i--) {
insertSort(A, N, G[i]);
}
}
🔎対象ソースは以下に格納.
/source/1.sort/shell.cpp