El ordenamiento Shell, denomino así por su desarrollador Donald Shell (1959), ordena una estructura de una manera similar a la del Bubble Sort, sin embargo no ordena elementos adyacentes sino que utiliza una segmentación entre los datos. Esta segmentación puede ser en cualquier tamaño de acuerdo a una secuencia de valores que empiezan con un valor grande y van disminuyendo hasta llegar al '1'.
El ShellSort ordena subgrupos de elementos separados K unidades (respecto de su posición en el arreglo) del arreglo o lista original. El valor K es llamado incremento.
Después de que los primeros K subgrupos han sido ordenados (generalmente se utiliza inserción directa), se escoge un nuevo valor de K más pequeño, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor más pequeño de K, como en la grafica de arriba.
A continuación el algoritmo de ordenamiento por el método shell en java.
int[] ShellSort(int[] array){
int gap = array.length / 2;
while (gap > 0) {
for (int i = 0; i < array.length - gap; i++) {
int j = i + gap;
int tmp = array[j];
while (j >= gap && tmp > array[j - gap]) {//tmp < array[j-gap] otro orden
array[j] = array[j - gap];
j -= gap;
}
array[j] = tmp;
}
if (gap == 2) {
gap = 1;
}else{
gap /= 2.2;
}
}
return array;
}