シェルソートは挿入ソートを改良したソートアルゴリズムで、データを間隔hごとのグループに分けてそれぞれ挿入ソートを行うという操作を、hを徐々に減らしながら繰り返しデータ全体をソートする。

シェルソートの実行例

単純に考えるとシェルソートは挿入ソートを繰り返し実行しているので挿入ソートよりも遅くなりそうだが、交換回数が少なくなるので高速にソートすることができる。 シェルソートでは間隔hの決め方が重要で、実際に実験してみたところ間隔hを変えるだけで実行速度に10倍以上の差が出た。


シェルソートでの間隔hを決めるときにはh0 = 1としてhn+1 = 3*hn+1hn+1 = 2*hn+1のようなhn+1 = a*hn+bという形の漸化式を使うことが多い。例えば、1000個のデータに対してhn+1 = 3*hn+1を使うと間隔hは364, 121, 40, 13, 4, 1と減っていく。

この漸化式hn+1 = a*hn+bのaとbの値を変えるだけでも実行速度が大きく変わることがある。ランダムに生成した100万個のデータに対してa = 2 ~ 20b = 0 ~ 20の範囲でそれぞれ100回ずつシェルソートを実行する実験を行ったところ、最も遅いものがa = 20b = 0で平均6.012秒、最も早いものがa = 3b = 1で平均0.392秒と約15倍もの差が出た。

この実験結果をヒートマップで表示すると以下のようになる。横軸がaの値で、縦軸がbの値、色が実行速度を表している。この結果からb = 0a = bとなる値は避けた方が良さそうだとわかる。

間隔hを決める式はhn+1 = a*hn+bという形の漸化式以外にも様々な式が考えられている。 例えば、hn = 2n+1-1hn = 9*4n-9*2n+1hn = 2n*3nといった式などがあり、複雑なものではfibonacci(i)をフィボナッチ数列のi番目の値としてhn = floor(fibonacci(n+1)1+sqrt(5))という式を使うこともある。

hn+1 = a*hn+bとは異なる6つの式と挿入ソートでも同様に実験し、先程の結果と合わせて実行速度が速い順に並べると以下のようになった。新しく加えた式の結果は色を変えている。

間隔hの計算式実行速度(msec)
hn = 4n+3*2n-1+1
(ただし、h0 = 1)
263
hn = floor(fibonacci(n+1)1+sqrt(5))276
hn = 9*4n-9*2n+1291
hn+1 = 3*hn+1392
hn+1 = 3*hn+4407
hn+1 = 3*hn+5408
hn+1 = 3*hn+2409
hn+1 = 3*hn+7414
hn+1 = 4*hn+1417
hn+1 = 3*hn+8419
hn+1 = 4*hn+5429
hn+1 = 2*hn+1430
hn+1 = 3*hn+10430
hn = 2n+1-1431
hn+1 = 2*hn+5434
hn+1 = 4*hn+7435
hn+1 = 4*hn+3435
hn+1 = 2*hn+3438
hn+1 = 3*hn+11438
hn+1 = 2*hn+7439
hn+1 = 2*hn+9442
hn+1 = 5*hn+1443
hn+1 = 4*hn+9448
hn+1 = 2*hn+11450
hn+1 = 3*hn+13453
hn+1 = 5*hn+2455
hn+1 = 5*hn+4455
hn+1 = 5*hn+3457
hn+1 = 4*hn+11460
hn+1 = 5*hn+6463
hn+1 = 3*hn+14463
hn+1 = 2*hn+13464
hn+1 = 5*hn+7467
hn+1 = 5*hn+8470
hn+1 = 5*hn+9477
hn+1 = 4*hn+13482
hn+1 = 2*hn+15485
hn+1 = 6*hn+5486
hn+1 = 6*hn+1488
hn+1 = 3*hn+16495
hn+1 = 5*hn+11495
hn+1 = 6*hn+7497
hn+1 = 3*hn+17506
hn+1 = 2*hn+17507
hn+1 = 4*hn+15510
hn+1 = 5*hn+12511
hn+1 = 7*hn+3516
hn+1 = 7*hn+2518
hn+1 = 7*hn+5518
hn+1 = 7*hn+4519
hn+1 = 7*hn+1522
hn+1 = 5*hn+13524
hn+1 = 7*hn+6527
hn+1 = 2*hn+19532
hn+1 = 6*hn+11536
hn+1 = 3*hn+19536
hn+1 = 5*hn+14542
hn+1 = 8*hn+3544
hn+1 = 7*hn+8545
hn+1 = 4*hn+17547
hn+1 = 8*hn+1548
hn+1 = 7*hn+9550
hn+1 = 8*hn+5553
hn+1 = 3*hn+20557
hn+1 = 7*hn+10567
hn+1 = 6*hn+13572
hn+1 = 9*hn+1576
hn+1 = 5*hn+16578
hn+1 = 7*hn+11580
hn+1 = 9*hn+2580
hn+1 = 9*hn+4583
hn+1 = 4*hn+19586
hn+1 = 9*hn+5590
hn+1 = 7*hn+12599
hn+1 = 5*hn+17599
hn+1 = 8*hn+9600
hn+1 = 10*hn+1600
hn+1 = 8*hn+7605
hn+1 = 10*hn+3614
hn+1 = 9*hn+7614
hn+1 = 7*hn+13618
hn+1 = 5*hn+18623
hn+1 = 9*hn+8627
hn+1 = 8*hn+11630
hn+1 = 11*hn+1633
hn+1 = 11*hn+2640
hn+1 = 11*hn+3644
hn+1 = 5*hn+19645
hn+1 = 10*hn+7652
hn+1 = 11*hn+4654
hn+1 = 9*hn+10659
hn+1 = 6*hn+17662
hn+1 = 12*hn+1662
hn+1 = 11*hn+5668
hn+1 = 7*hn+15669
hn+1 = 8*hn+13673
hn+1 = 11*hn+6683
hn+1 = 9*hn+11685
hn+1 = 7*hn+16694
hn+1 = 10*hn+9695
hn+1 = 13*hn+1697
hn+1 = 12*hn+5704
hn+1 = 6*hn+19708
hn+1 = 13*hn+2708
hn+1 = 11*hn+7712
hn+1 = 7*hn+17716
hn+1 = 11*hn+8718
hn+1 = 13*hn+3721
hn+1 = 8*hn+15723
hn+1 = 14*hn+1732
hn+1 = 9*hn+13734
hn+1 = 10*hn+11736
hn+1 = 13*hn+4741
hn+1 = 12*hn+7746
hn+1 = 11*hn+9747
hn+1 = 7*hn+18748
hn+1 = 13*hn+5753
hn+1 = 9*hn+14758
hn+1 = 14*hn+3759
hn+1 = 11*hn+10765
hn+1 = 15*hn+1771
hn+1 = 7*hn+19775
hn+1 = 13*hn+6776
hn+1 = 8*hn+17784
hn+1 = 10*hn+13786
hn+1 = 15*hn+2793
hn+1 = 7*hn+20796
hn+1 = 13*hn+7802
hn+1 = 14*hn+5802
hn+1 = 9*hn+16812
hn+1 = 16*hn+1814
hn+1 = 11*hn+12818
hn+1 = 13*hn+8824
hn+1 = 15*hn+4829
hn+1 = 9*hn+17837
hn+1 = 11*hn+13846
hn+1 = 8*hn+19848
hn+1 = 12*hn+11859
hn+1 = 13*hn+9859
hn+1 = 17*hn+1862
hn+1 = 16*hn+3863
hn+1 = 11*hn+14877
hn+1 = 17*hn+2878
hn+1 = 13*hn+10880
hn+1 = 18*hn+1906
hn+1 = 17*hn+3907
hn+1 = 14*hn+9910
hn+1 = 15*hn+7910
hn+1 = 12*hn+13912
hn+1 = 10*hn+17915
hn+1 = 13*hn+11915
hn+1 = 9*hn+19918
hn+1 = 11*hn+15921
hn+1 = 16*hn+5932
hn+1 = 17*hn+4934
hn+1 = 15*hn+8938
hn+1 = 9*hn+20943
hn+1 = 13*hn+12946
hn+1 = 17*hn+5953
hn+1 = 11*hn+16955
hn+1 = 19*hn+1956
hn+1 = 16*hn+7967
hn+1 = 19*hn+2982
hn+1 = 14*hn+11983
hn+1 = 11*hn+17985
hn+1 = 10*hn+19989
hn+1 = 17*hn+6994
hn+1 = 11*hn+181008
hn+1 = 20*hn+11013
hn+1 = 19*hn+31015
hn+1 = 18*hn+51025
hn+1 = 13*hn+141025
hn+1 = 11*hn+191028
hn+1 = 16*hn+91028
hn+1 = 17*hn+71028
hn+1 = 15*hn+111032
hn+1 = 19*hn+41039
hn+1 = 12*hn+171040
hn+1 = 13*hn+151041
hn+1 = 14*hn+131050
hn+1 = 13*hn+161056
hn+1 = 17*hn+81060
hn+1 = 20*hn+31070
hn+1 = 18*hn+71079
hn+1 = 19*hn+51081
hn+1 = 11*hn+201095
hn+1 = 16*hn+111095
hn+1 = 15*hn+131099
hn+1 = 17*hn+91103
hn+1 = 14*hn+151110
hn+1 = 4*hn+21111
hn+1 = 4*hn+61112
hn+1 = 4*hn+101112
hn+1 = 12*hn+191118
hn+1 = 13*hn+171120
hn+1 = 19*hn+61122
hn+1 = 4*hn+141123
hn+1 = 17*hn+101129
hn+1 = 2*hn+21130
hn+1 = 2*hn+101130
hn+1 = 2*hn+61132
hn+1 = 2*hn+141132
hn+1 = 4*hn+181132
hn+1 = 2*hn+181139
hn+1 = 19*hn+71144
hn+1 = 13*hn+181146
hn+1 = 15*hn+141157
hn+1 = 6*hn+21158
hn+1 = 17*hn+111160
hn+1 = 16*hn+131166
hn+1 = 2*hn+201167
hn+1 = 6*hn+81167
hn+1 = 6*hn+101169
hn+1 = 6*hn+141170
hn+1 = 2*hn+161174
hn+1 = 2*hn+121178
hn+1 = 6*hn+161179
hn+1 = 19*hn+81184
hn+1 = 17*hn+121184
hn+1 = 14*hn+171185
hn+1 = 6*hn+41194
hn+1 = 6*hn+201194
hn+1 = 13*hn+191195
hn+1 = 19*hn+91214
hn+1 = 8*hn+101219
hn+1 = 13*hn+201219
hn+1 = 15*hn+161222
hn+1 = 8*hn+61222
hn+1 = 18*hn+111223
hn+1 = 20*hn+71223
hn+1 = 8*hn+21228
hn+1 = 8*hn+141230
hn+1 = 19*hn+101234
hn+1 = 2*hn+81240
hn+1 = 17*hn+131243
hn+1 = 8*hn+181247
hn+1 = 15*hn+171250
hn+1 = 17*hn+141255
hn+1 = 14*hn+191259
hn+1 = 16*hn+151265
hn+1 = 10*hn+81271
hn+1 = 10*hn+41274
hn+1 = 10*hn+61274
hn+1 = 10*hn+121275
hn+1 = 2*hn+41280
hn+1 = 20*hn+91281
hn+1 = 10*hn+21284
hn+1 = 10*hn+141284
hn+1 = 19*hn+111288
hn+1 = 10*hn+161297
hn+1 = 17*hn+151302
hn+1 = 10*hn+181312
hn+1 = 16*hn+171315
hn+1 = 18*hn+131318
hn+1 = 19*hn+121320
hn+1 = 12*hn+101324
hn+1 = 15*hn+191326
hn+1 = 12*hn+21327
hn+1 = 20*hn+111337
hn+1 = 17*hn+161342
hn+1 = 12*hn+141343
hn+1 = 14*hn+61365
hn+1 = 14*hn+21366
hn+1 = 14*hn+81367
hn+1 = 16*hn+191371
hn+1 = 19*hn+131377
hn+1 = 14*hn+101382
hn+1 = 14*hn+41388
hn+1 = 14*hn+121393
hn+1 = 19*hn+141393
hn+1 = 17*hn+181411
hn+1 = 16*hn+21414
1, 4, 10, 23, 57, 132, 301, 701, 1750
(ただし、1750以降は hn+1 = round(hn*2.2) )
1415
hn+1 = 20*hn+131417
hn+1 = 16*hn+61418
hn+1 = 14*hn+161423
hn+1 = 16*hn+101434
hn+1 = 17*hn+191440
hn+1 = 18*hn+171451
hn+1 = 18*hn+21454
hn+1 = 19*hn+151454
hn+1 = 14*hn+181456
hn+1 = 18*hn+41458
hn+1 = 3*hn+121467
hn+1 = 3*hn+31467
hn+1 = 16*hn+141468
hn+1 = 3*hn+151470
hn+1 = 3*hn+61470
hn+1 = 14*hn+201475
hn+1 = 18*hn+81478
hn+1 = 19*hn+161481
hn+1 = 17*hn+201485
hn+1 = 18*hn+101498
hn+1 = 19*hn+171501
hn+1 = 20*hn+21508
hn+1 = 6*hn+31517
hn+1 = 16*hn+181524
hn+1 = 20*hn+61525
hn+1 = 3*hn+181529
hn+1 = 6*hn+151529
hn+1 = 20*hn+171532
hn+1 = 18*hn+191542
hn+1 = 19*hn+181544
hn+1 = 18*hn+141549
hn+1 = 18*hn+161575
hn+1 = 6*hn+91577
hn+1 = 19*hn+201594
hn+1 = 9*hn+151597
hn+1 = 9*hn+121601
hn+1 = 3*hn+91606
hn+1 = 9*hn+61610
hn+1 = 9*hn+31612
hn+1 = 20*hn+191612
hn+1 = 20*hn+141619
hn+1 = 18*hn+201647
hn+1 = 12*hn+151665
hn+1 = 12*hn+91671
hn+1 = 12*hn+31690
hn+1 = 20*hn+181706
hn+1 = 15*hn+121732
hn+1 = 15*hn+91733
hn+1 = 15*hn+61737
hn+1 = 15*hn+181751
hn+1 = 15*hn+31756
hn+1 = 18*hn+31802
hn+1 = 18*hn+151817
hn+1 = 4*hn+121890
hn+1 = 4*hn+41893
hn+1 = 4*hn+201897
hn+1 = 4*hn+81978
hn+1 = 8*hn+201982
hn+1 = 4*hn+161984
hn+1 = 8*hn+121989
hn+1 = 8*hn+41990
hn+1 = 12*hn+202070
hn+1 = 12*hn+162072
hn+1 = 12*hn+82090
hn+1 = 12*hn+42097
hn+1 = 16*hn+122157
hn+1 = 16*hn+202163
hn+1 = 16*hn+42176
hn+1 = 5*hn+52210
hn+1 = 5*hn+102213
hn+1 = 5*hn+202217
hn+1 = 5*hn+152217
hn+1 = 20*hn+82239
hn+1 = 20*hn+122249
hn+1 = 20*hn+42249
hn+1 = 20*hn+162252
hn+1 = 10*hn+152341
hn+1 = 10*hn+52355
hn+1 = 15*hn+202437
hn+1 = 15*hn+102441
hn+1 = 15*hn+52461
hn+1 = 6*hn+62463
hn+1 = 6*hn+122517
hn+1 = 6*hn+182524
hn+1 = 20*hn+152533
hn+1 = 20*hn+52546
hn+1 = 12*hn+182603
hn+1 = 12*hn+62626
hn+1 = 18*hn+122724
hn+1 = 18*hn+62743
hn+1 = 7*hn+72796
hn+1 = 7*hn+142810
hn+1 = 2*hn+02856
hn+1 = 14*hn+72973
hn+1 = 8*hn+82978
hn+1 = 8*hn+162994
hn+1 = 3*hn+03001
hn+1 = 16*hn+83162
hn+1 = 9*hn+93204
hn+1 = 9*hn+183206
hn+1 = 4*hn+03376
hn+1 = 18*hn+93395
hn+1 = 10*hn+203414
hn+1 = 10*hn+103422
hn+1 = 5*hn+03546
hn+1 = 11*hn+113572
hn+1 = 20*hn+103619
hn+1 = 6*hn+03749
hn = 2n*3n3750
hn+1 = 12*hn+123768
hn+1 = 13*hn+133960
hn+1 = 7*hn+04039
hn+1 = 14*hn+144197
hn+1 = 15*hn+154255
hn+1 = 8*hn+04262
hn+1 = 9*hn+04348
hn+1 = 16*hn+164489
hn+1 = 10*hn+04523
hn+1 = 17*hn+174561
hn+1 = 11*hn+04649
hn+1 = 18*hn+184802
hn+1 = 12*hn+04825
hn+1 = 19*hn+194897
hn+1 = 13*hn+04981
hn+1 = 20*hn+205088
hn+1 = 14*hn+05222
hn+1 = 15*hn+05261
hn+1 = 17*hn+05542
hn+1 = 16*hn+05562
hn+1 = 18*hn+05760
hn+1 = 19*hn+05826
hn+1 = 20*hn+06012
挿入ソート1235009

(※今回実験に使ったソースコードはコレ。)

hn = 4n+3*2n-1+1 (ただし、h0 = 1)は、最初の結果で最も早かったhn+1 = 3*hn+1よりもさらに約1.5倍速いという結果になった。 この差は僅かなのでそれほど気にしなくても良さそうだが、hn+1 = a*hn+bの漸化式でb = 0a = bとなる値を使わないように注意しなければならない。よく見てみるとa = b * 2a = b / 2a = b * 3といった場合にも比較的遅くなっているので、この形の漸化式を使うのならとりえあずhn+1 = 3*hn+1を使っておくのが無難そうだ。