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

単純に考えるとシェルソートは挿入ソートを繰り返し実行しているので挿入ソートよりも遅くなりそうだが、交換回数が少なくなるので高速にソートすることができる。 シェルソートでは間隔hの決め方が重要で、実際に実験してみたところ間隔hを変えるだけで実行速度に10倍以上の差が出た。
シェルソートでの間隔hを決めるときにはh0 = 1としてhn+1 = 3*hn+1やhn+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 ~ 20、b = 0 ~ 20の範囲でそれぞれ100回ずつシェルソートを実行する実験を行ったところ、最も遅いものがa = 20、b = 0で平均6.012秒、最も早いものがa = 3、b = 1で平均0.392秒と約15倍もの差が出た。
この実験結果をヒートマップで表示すると以下のようになる。横軸がaの値で、縦軸がbの値、色が実行速度を表している。この結果からb = 0やa = bとなる値は避けた方が良さそうだとわかる。
間隔hを決める式はhn+1 = a*hn+bという形の漸化式以外にも様々な式が考えられている。 例えば、hn = 2n+1-1やhn = 9*4n-9*2n+1、hn = 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+1 | 291 |
| hn+1 = 3*hn+1 | 392 |
| hn+1 = 3*hn+4 | 407 |
| hn+1 = 3*hn+5 | 408 |
| hn+1 = 3*hn+2 | 409 |
| hn+1 = 3*hn+7 | 414 |
| hn+1 = 4*hn+1 | 417 |
| hn+1 = 3*hn+8 | 419 |
| hn+1 = 4*hn+5 | 429 |
| hn+1 = 2*hn+1 | 430 |
| hn+1 = 3*hn+10 | 430 |
| hn = 2n+1-1 | 431 |
| hn+1 = 2*hn+5 | 434 |
| hn+1 = 4*hn+7 | 435 |
| hn+1 = 4*hn+3 | 435 |
| hn+1 = 2*hn+3 | 438 |
| hn+1 = 3*hn+11 | 438 |
| hn+1 = 2*hn+7 | 439 |
| hn+1 = 2*hn+9 | 442 |
| hn+1 = 5*hn+1 | 443 |
| hn+1 = 4*hn+9 | 448 |
| hn+1 = 2*hn+11 | 450 |
| hn+1 = 3*hn+13 | 453 |
| hn+1 = 5*hn+2 | 455 |
| hn+1 = 5*hn+4 | 455 |
| hn+1 = 5*hn+3 | 457 |
| hn+1 = 4*hn+11 | 460 |
| hn+1 = 5*hn+6 | 463 |
| hn+1 = 3*hn+14 | 463 |
| hn+1 = 2*hn+13 | 464 |
| hn+1 = 5*hn+7 | 467 |
| hn+1 = 5*hn+8 | 470 |
| hn+1 = 5*hn+9 | 477 |
| hn+1 = 4*hn+13 | 482 |
| hn+1 = 2*hn+15 | 485 |
| hn+1 = 6*hn+5 | 486 |
| hn+1 = 6*hn+1 | 488 |
| hn+1 = 3*hn+16 | 495 |
| hn+1 = 5*hn+11 | 495 |
| hn+1 = 6*hn+7 | 497 |
| hn+1 = 3*hn+17 | 506 |
| hn+1 = 2*hn+17 | 507 |
| hn+1 = 4*hn+15 | 510 |
| hn+1 = 5*hn+12 | 511 |
| hn+1 = 7*hn+3 | 516 |
| hn+1 = 7*hn+2 | 518 |
| hn+1 = 7*hn+5 | 518 |
| hn+1 = 7*hn+4 | 519 |
| hn+1 = 7*hn+1 | 522 |
| hn+1 = 5*hn+13 | 524 |
| hn+1 = 7*hn+6 | 527 |
| hn+1 = 2*hn+19 | 532 |
| hn+1 = 6*hn+11 | 536 |
| hn+1 = 3*hn+19 | 536 |
| hn+1 = 5*hn+14 | 542 |
| hn+1 = 8*hn+3 | 544 |
| hn+1 = 7*hn+8 | 545 |
| hn+1 = 4*hn+17 | 547 |
| hn+1 = 8*hn+1 | 548 |
| hn+1 = 7*hn+9 | 550 |
| hn+1 = 8*hn+5 | 553 |
| hn+1 = 3*hn+20 | 557 |
| hn+1 = 7*hn+10 | 567 |
| hn+1 = 6*hn+13 | 572 |
| hn+1 = 9*hn+1 | 576 |
| hn+1 = 5*hn+16 | 578 |
| hn+1 = 7*hn+11 | 580 |
| hn+1 = 9*hn+2 | 580 |
| hn+1 = 9*hn+4 | 583 |
| hn+1 = 4*hn+19 | 586 |
| hn+1 = 9*hn+5 | 590 |
| hn+1 = 7*hn+12 | 599 |
| hn+1 = 5*hn+17 | 599 |
| hn+1 = 8*hn+9 | 600 |
| hn+1 = 10*hn+1 | 600 |
| hn+1 = 8*hn+7 | 605 |
| hn+1 = 10*hn+3 | 614 |
| hn+1 = 9*hn+7 | 614 |
| hn+1 = 7*hn+13 | 618 |
| hn+1 = 5*hn+18 | 623 |
| hn+1 = 9*hn+8 | 627 |
| hn+1 = 8*hn+11 | 630 |
| hn+1 = 11*hn+1 | 633 |
| hn+1 = 11*hn+2 | 640 |
| hn+1 = 11*hn+3 | 644 |
| hn+1 = 5*hn+19 | 645 |
| hn+1 = 10*hn+7 | 652 |
| hn+1 = 11*hn+4 | 654 |
| hn+1 = 9*hn+10 | 659 |
| hn+1 = 6*hn+17 | 662 |
| hn+1 = 12*hn+1 | 662 |
| hn+1 = 11*hn+5 | 668 |
| hn+1 = 7*hn+15 | 669 |
| hn+1 = 8*hn+13 | 673 |
| hn+1 = 11*hn+6 | 683 |
| hn+1 = 9*hn+11 | 685 |
| hn+1 = 7*hn+16 | 694 |
| hn+1 = 10*hn+9 | 695 |
| hn+1 = 13*hn+1 | 697 |
| hn+1 = 12*hn+5 | 704 |
| hn+1 = 6*hn+19 | 708 |
| hn+1 = 13*hn+2 | 708 |
| hn+1 = 11*hn+7 | 712 |
| hn+1 = 7*hn+17 | 716 |
| hn+1 = 11*hn+8 | 718 |
| hn+1 = 13*hn+3 | 721 |
| hn+1 = 8*hn+15 | 723 |
| hn+1 = 14*hn+1 | 732 |
| hn+1 = 9*hn+13 | 734 |
| hn+1 = 10*hn+11 | 736 |
| hn+1 = 13*hn+4 | 741 |
| hn+1 = 12*hn+7 | 746 |
| hn+1 = 11*hn+9 | 747 |
| hn+1 = 7*hn+18 | 748 |
| hn+1 = 13*hn+5 | 753 |
| hn+1 = 9*hn+14 | 758 |
| hn+1 = 14*hn+3 | 759 |
| hn+1 = 11*hn+10 | 765 |
| hn+1 = 15*hn+1 | 771 |
| hn+1 = 7*hn+19 | 775 |
| hn+1 = 13*hn+6 | 776 |
| hn+1 = 8*hn+17 | 784 |
| hn+1 = 10*hn+13 | 786 |
| hn+1 = 15*hn+2 | 793 |
| hn+1 = 7*hn+20 | 796 |
| hn+1 = 13*hn+7 | 802 |
| hn+1 = 14*hn+5 | 802 |
| hn+1 = 9*hn+16 | 812 |
| hn+1 = 16*hn+1 | 814 |
| hn+1 = 11*hn+12 | 818 |
| hn+1 = 13*hn+8 | 824 |
| hn+1 = 15*hn+4 | 829 |
| hn+1 = 9*hn+17 | 837 |
| hn+1 = 11*hn+13 | 846 |
| hn+1 = 8*hn+19 | 848 |
| hn+1 = 12*hn+11 | 859 |
| hn+1 = 13*hn+9 | 859 |
| hn+1 = 17*hn+1 | 862 |
| hn+1 = 16*hn+3 | 863 |
| hn+1 = 11*hn+14 | 877 |
| hn+1 = 17*hn+2 | 878 |
| hn+1 = 13*hn+10 | 880 |
| hn+1 = 18*hn+1 | 906 |
| hn+1 = 17*hn+3 | 907 |
| hn+1 = 14*hn+9 | 910 |
| hn+1 = 15*hn+7 | 910 |
| hn+1 = 12*hn+13 | 912 |
| hn+1 = 10*hn+17 | 915 |
| hn+1 = 13*hn+11 | 915 |
| hn+1 = 9*hn+19 | 918 |
| hn+1 = 11*hn+15 | 921 |
| hn+1 = 16*hn+5 | 932 |
| hn+1 = 17*hn+4 | 934 |
| hn+1 = 15*hn+8 | 938 |
| hn+1 = 9*hn+20 | 943 |
| hn+1 = 13*hn+12 | 946 |
| hn+1 = 17*hn+5 | 953 |
| hn+1 = 11*hn+16 | 955 |
| hn+1 = 19*hn+1 | 956 |
| hn+1 = 16*hn+7 | 967 |
| hn+1 = 19*hn+2 | 982 |
| hn+1 = 14*hn+11 | 983 |
| hn+1 = 11*hn+17 | 985 |
| hn+1 = 10*hn+19 | 989 |
| hn+1 = 17*hn+6 | 994 |
| hn+1 = 11*hn+18 | 1008 |
| hn+1 = 20*hn+1 | 1013 |
| hn+1 = 19*hn+3 | 1015 |
| hn+1 = 18*hn+5 | 1025 |
| hn+1 = 13*hn+14 | 1025 |
| hn+1 = 11*hn+19 | 1028 |
| hn+1 = 16*hn+9 | 1028 |
| hn+1 = 17*hn+7 | 1028 |
| hn+1 = 15*hn+11 | 1032 |
| hn+1 = 19*hn+4 | 1039 |
| hn+1 = 12*hn+17 | 1040 |
| hn+1 = 13*hn+15 | 1041 |
| hn+1 = 14*hn+13 | 1050 |
| hn+1 = 13*hn+16 | 1056 |
| hn+1 = 17*hn+8 | 1060 |
| hn+1 = 20*hn+3 | 1070 |
| hn+1 = 18*hn+7 | 1079 |
| hn+1 = 19*hn+5 | 1081 |
| hn+1 = 11*hn+20 | 1095 |
| hn+1 = 16*hn+11 | 1095 |
| hn+1 = 15*hn+13 | 1099 |
| hn+1 = 17*hn+9 | 1103 |
| hn+1 = 14*hn+15 | 1110 |
| hn+1 = 4*hn+2 | 1111 |
| hn+1 = 4*hn+6 | 1112 |
| hn+1 = 4*hn+10 | 1112 |
| hn+1 = 12*hn+19 | 1118 |
| hn+1 = 13*hn+17 | 1120 |
| hn+1 = 19*hn+6 | 1122 |
| hn+1 = 4*hn+14 | 1123 |
| hn+1 = 17*hn+10 | 1129 |
| hn+1 = 2*hn+2 | 1130 |
| hn+1 = 2*hn+10 | 1130 |
| hn+1 = 2*hn+6 | 1132 |
| hn+1 = 2*hn+14 | 1132 |
| hn+1 = 4*hn+18 | 1132 |
| hn+1 = 2*hn+18 | 1139 |
| hn+1 = 19*hn+7 | 1144 |
| hn+1 = 13*hn+18 | 1146 |
| hn+1 = 15*hn+14 | 1157 |
| hn+1 = 6*hn+2 | 1158 |
| hn+1 = 17*hn+11 | 1160 |
| hn+1 = 16*hn+13 | 1166 |
| hn+1 = 2*hn+20 | 1167 |
| hn+1 = 6*hn+8 | 1167 |
| hn+1 = 6*hn+10 | 1169 |
| hn+1 = 6*hn+14 | 1170 |
| hn+1 = 2*hn+16 | 1174 |
| hn+1 = 2*hn+12 | 1178 |
| hn+1 = 6*hn+16 | 1179 |
| hn+1 = 19*hn+8 | 1184 |
| hn+1 = 17*hn+12 | 1184 |
| hn+1 = 14*hn+17 | 1185 |
| hn+1 = 6*hn+4 | 1194 |
| hn+1 = 6*hn+20 | 1194 |
| hn+1 = 13*hn+19 | 1195 |
| hn+1 = 19*hn+9 | 1214 |
| hn+1 = 8*hn+10 | 1219 |
| hn+1 = 13*hn+20 | 1219 |
| hn+1 = 15*hn+16 | 1222 |
| hn+1 = 8*hn+6 | 1222 |
| hn+1 = 18*hn+11 | 1223 |
| hn+1 = 20*hn+7 | 1223 |
| hn+1 = 8*hn+2 | 1228 |
| hn+1 = 8*hn+14 | 1230 |
| hn+1 = 19*hn+10 | 1234 |
| hn+1 = 2*hn+8 | 1240 |
| hn+1 = 17*hn+13 | 1243 |
| hn+1 = 8*hn+18 | 1247 |
| hn+1 = 15*hn+17 | 1250 |
| hn+1 = 17*hn+14 | 1255 |
| hn+1 = 14*hn+19 | 1259 |
| hn+1 = 16*hn+15 | 1265 |
| hn+1 = 10*hn+8 | 1271 |
| hn+1 = 10*hn+4 | 1274 |
| hn+1 = 10*hn+6 | 1274 |
| hn+1 = 10*hn+12 | 1275 |
| hn+1 = 2*hn+4 | 1280 |
| hn+1 = 20*hn+9 | 1281 |
| hn+1 = 10*hn+2 | 1284 |
| hn+1 = 10*hn+14 | 1284 |
| hn+1 = 19*hn+11 | 1288 |
| hn+1 = 10*hn+16 | 1297 |
| hn+1 = 17*hn+15 | 1302 |
| hn+1 = 10*hn+18 | 1312 |
| hn+1 = 16*hn+17 | 1315 |
| hn+1 = 18*hn+13 | 1318 |
| hn+1 = 19*hn+12 | 1320 |
| hn+1 = 12*hn+10 | 1324 |
| hn+1 = 15*hn+19 | 1326 |
| hn+1 = 12*hn+2 | 1327 |
| hn+1 = 20*hn+11 | 1337 |
| hn+1 = 17*hn+16 | 1342 |
| hn+1 = 12*hn+14 | 1343 |
| hn+1 = 14*hn+6 | 1365 |
| hn+1 = 14*hn+2 | 1366 |
| hn+1 = 14*hn+8 | 1367 |
| hn+1 = 16*hn+19 | 1371 |
| hn+1 = 19*hn+13 | 1377 |
| hn+1 = 14*hn+10 | 1382 |
| hn+1 = 14*hn+4 | 1388 |
| hn+1 = 14*hn+12 | 1393 |
| hn+1 = 19*hn+14 | 1393 |
| hn+1 = 17*hn+18 | 1411 |
| hn+1 = 16*hn+2 | 1414 |
| 1, 4, 10, 23, 57, 132, 301, 701, 1750 (ただし、1750以降は hn+1 = round(hn*2.2) ) | 1415 |
| hn+1 = 20*hn+13 | 1417 |
| hn+1 = 16*hn+6 | 1418 |
| hn+1 = 14*hn+16 | 1423 |
| hn+1 = 16*hn+10 | 1434 |
| hn+1 = 17*hn+19 | 1440 |
| hn+1 = 18*hn+17 | 1451 |
| hn+1 = 18*hn+2 | 1454 |
| hn+1 = 19*hn+15 | 1454 |
| hn+1 = 14*hn+18 | 1456 |
| hn+1 = 18*hn+4 | 1458 |
| hn+1 = 3*hn+12 | 1467 |
| hn+1 = 3*hn+3 | 1467 |
| hn+1 = 16*hn+14 | 1468 |
| hn+1 = 3*hn+15 | 1470 |
| hn+1 = 3*hn+6 | 1470 |
| hn+1 = 14*hn+20 | 1475 |
| hn+1 = 18*hn+8 | 1478 |
| hn+1 = 19*hn+16 | 1481 |
| hn+1 = 17*hn+20 | 1485 |
| hn+1 = 18*hn+10 | 1498 |
| hn+1 = 19*hn+17 | 1501 |
| hn+1 = 20*hn+2 | 1508 |
| hn+1 = 6*hn+3 | 1517 |
| hn+1 = 16*hn+18 | 1524 |
| hn+1 = 20*hn+6 | 1525 |
| hn+1 = 3*hn+18 | 1529 |
| hn+1 = 6*hn+15 | 1529 |
| hn+1 = 20*hn+17 | 1532 |
| hn+1 = 18*hn+19 | 1542 |
| hn+1 = 19*hn+18 | 1544 |
| hn+1 = 18*hn+14 | 1549 |
| hn+1 = 18*hn+16 | 1575 |
| hn+1 = 6*hn+9 | 1577 |
| hn+1 = 19*hn+20 | 1594 |
| hn+1 = 9*hn+15 | 1597 |
| hn+1 = 9*hn+12 | 1601 |
| hn+1 = 3*hn+9 | 1606 |
| hn+1 = 9*hn+6 | 1610 |
| hn+1 = 9*hn+3 | 1612 |
| hn+1 = 20*hn+19 | 1612 |
| hn+1 = 20*hn+14 | 1619 |
| hn+1 = 18*hn+20 | 1647 |
| hn+1 = 12*hn+15 | 1665 |
| hn+1 = 12*hn+9 | 1671 |
| hn+1 = 12*hn+3 | 1690 |
| hn+1 = 20*hn+18 | 1706 |
| hn+1 = 15*hn+12 | 1732 |
| hn+1 = 15*hn+9 | 1733 |
| hn+1 = 15*hn+6 | 1737 |
| hn+1 = 15*hn+18 | 1751 |
| hn+1 = 15*hn+3 | 1756 |
| hn+1 = 18*hn+3 | 1802 |
| hn+1 = 18*hn+15 | 1817 |
| hn+1 = 4*hn+12 | 1890 |
| hn+1 = 4*hn+4 | 1893 |
| hn+1 = 4*hn+20 | 1897 |
| hn+1 = 4*hn+8 | 1978 |
| hn+1 = 8*hn+20 | 1982 |
| hn+1 = 4*hn+16 | 1984 |
| hn+1 = 8*hn+12 | 1989 |
| hn+1 = 8*hn+4 | 1990 |
| hn+1 = 12*hn+20 | 2070 |
| hn+1 = 12*hn+16 | 2072 |
| hn+1 = 12*hn+8 | 2090 |
| hn+1 = 12*hn+4 | 2097 |
| hn+1 = 16*hn+12 | 2157 |
| hn+1 = 16*hn+20 | 2163 |
| hn+1 = 16*hn+4 | 2176 |
| hn+1 = 5*hn+5 | 2210 |
| hn+1 = 5*hn+10 | 2213 |
| hn+1 = 5*hn+20 | 2217 |
| hn+1 = 5*hn+15 | 2217 |
| hn+1 = 20*hn+8 | 2239 |
| hn+1 = 20*hn+12 | 2249 |
| hn+1 = 20*hn+4 | 2249 |
| hn+1 = 20*hn+16 | 2252 |
| hn+1 = 10*hn+15 | 2341 |
| hn+1 = 10*hn+5 | 2355 |
| hn+1 = 15*hn+20 | 2437 |
| hn+1 = 15*hn+10 | 2441 |
| hn+1 = 15*hn+5 | 2461 |
| hn+1 = 6*hn+6 | 2463 |
| hn+1 = 6*hn+12 | 2517 |
| hn+1 = 6*hn+18 | 2524 |
| hn+1 = 20*hn+15 | 2533 |
| hn+1 = 20*hn+5 | 2546 |
| hn+1 = 12*hn+18 | 2603 |
| hn+1 = 12*hn+6 | 2626 |
| hn+1 = 18*hn+12 | 2724 |
| hn+1 = 18*hn+6 | 2743 |
| hn+1 = 7*hn+7 | 2796 |
| hn+1 = 7*hn+14 | 2810 |
| hn+1 = 2*hn+0 | 2856 |
| hn+1 = 14*hn+7 | 2973 |
| hn+1 = 8*hn+8 | 2978 |
| hn+1 = 8*hn+16 | 2994 |
| hn+1 = 3*hn+0 | 3001 |
| hn+1 = 16*hn+8 | 3162 |
| hn+1 = 9*hn+9 | 3204 |
| hn+1 = 9*hn+18 | 3206 |
| hn+1 = 4*hn+0 | 3376 |
| hn+1 = 18*hn+9 | 3395 |
| hn+1 = 10*hn+20 | 3414 |
| hn+1 = 10*hn+10 | 3422 |
| hn+1 = 5*hn+0 | 3546 |
| hn+1 = 11*hn+11 | 3572 |
| hn+1 = 20*hn+10 | 3619 |
| hn+1 = 6*hn+0 | 3749 |
| hn = 2n*3n | 3750 |
| hn+1 = 12*hn+12 | 3768 |
| hn+1 = 13*hn+13 | 3960 |
| hn+1 = 7*hn+0 | 4039 |
| hn+1 = 14*hn+14 | 4197 |
| hn+1 = 15*hn+15 | 4255 |
| hn+1 = 8*hn+0 | 4262 |
| hn+1 = 9*hn+0 | 4348 |
| hn+1 = 16*hn+16 | 4489 |
| hn+1 = 10*hn+0 | 4523 |
| hn+1 = 17*hn+17 | 4561 |
| hn+1 = 11*hn+0 | 4649 |
| hn+1 = 18*hn+18 | 4802 |
| hn+1 = 12*hn+0 | 4825 |
| hn+1 = 19*hn+19 | 4897 |
| hn+1 = 13*hn+0 | 4981 |
| hn+1 = 20*hn+20 | 5088 |
| hn+1 = 14*hn+0 | 5222 |
| hn+1 = 15*hn+0 | 5261 |
| hn+1 = 17*hn+0 | 5542 |
| hn+1 = 16*hn+0 | 5562 |
| hn+1 = 18*hn+0 | 5760 |
| hn+1 = 19*hn+0 | 5826 |
| hn+1 = 20*hn+0 | 6012 |
| 挿入ソート | 1235009 |
(※今回実験に使ったソースコードはコレ。)
hn = 4n+3*2n-1+1 (ただし、h0 = 1)は、最初の結果で最も早かったhn+1 = 3*hn+1よりもさらに約1.5倍速いという結果になった。 この差は僅かなのでそれほど気にしなくても良さそうだが、hn+1 = a*hn+bの漸化式でb = 0やa = bとなる値を使わないように注意しなければならない。よく見てみるとa = b * 2やa = b / 2、a = b * 3といった場合にも比較的遅くなっているので、この形の漸化式を使うのならとりえあずhn+1 = 3*hn+1を使っておくのが無難そうだ。