又称缩小增量排序:
function shellSort(array) {
var j, i, v, h=1, s=3, k,n = array.length
while(h < n)
h=s*h+1;
while(h > 1) {
h=(h-1)/s;
for (k=0; k<h; k++)
for (i=k+h,j=i; i<n; i+=h, j=i) {
v=array[i];
while(true)
if ((j-=h) >= 0 && array[j] > v)
array[j+h]=array[j];
else
break;
array[j+h]=v;
}
}
}
<!doctype html> <html dir="ltr" lang="zh-CN"> <head> <meta charset="utf-8"/> <title>希尔排序 by 司徒正美</title> <script type="text/javascript" charset="utf-8"> window.onload = function(){ var assert ,item,test = function(str){ if(!assert){ assert = document.createElement("ol"); assert.i = 0; item = document.createElement("li"); document.body.insertBefore(assert,null); } var li = item.cloneNode(false); assert.appendChild(li); li.innerHTML = str; assert.i++; li.style.backgroundColor = assert.i%2 === 1? "#e6e6e6" : "#D0E4FC"; }; function shellSort(array) { var j, i, v, h=1, s=3, k,n = array.length while(h < n) h=s*h+1; while(h > 1) { h=(h-1)/s; for (k=0; k<h; k++) for (i=k+h,j=i; i<n; i+=h, j=i) { v=array[i]; while(true) if ((j-=h) >= 0 && array[j] > v) array[j+h]=array[j]; else break; array[j+h]=v; } } } var randArray = []; for(i=0; i<100; i++) randArray[i]=Math.floor((Math.random())*10000); document.write('希尔排序
'); test('
未排序之前 '+randArray.join(" ")); shellSort(randArray); test('
排序之后 '+randArray.join(" ")); //http://www.irt.org/script/341.htm } </script> </head> <body> </body> </html>
运行代码
排序过程如【动画模拟演示】。