排序原理:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止
例如:对数组进行排序 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 根据排序原理先取一个正数5,分组结果为 10和7、32和12、1和0、9和4、5和3,然后进行直插排序,
第一轮排序结果为 7、12、0、4、3、10、32、1、9、5
具体演示看代码:
package insert.sort;
public class ShellSort {
public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 };
public static void main(String[] args) {
int i; // 循环计数变量
int index = a.length; // 数据索引变量
System.out.print("排序前:");
for (i = 0; i < index; i++) {
System.out.printf("%3s", a[i]);
System.out.print("");
}
System.out.println();
shellSort(index); // 希尔排序
System.out.print("排序后:");
for (i = 0; i < index; i++) {
System.out.printf("%3s", a[i]);
System.out.print("");
}
}
private static void shellSort(int index) {
// TODO Auto-generated method stub
int dataLength = index/2; //第一次分组,将数组分成两组
int position;
boolean change; //判断两个比较的数是否交换位置
while(dataLength!=0){
for (int i = dataLength; i < index; i++) {
change = false;
int temp = a[i]; //存储临时变量,存储欲比较的数为temp
position = i-dataLength; //确定与temp比较数的位置
while(temp<a[position]&&position>=0&&position<=index){ //在同一组中进行直插排序,直到排序完毕跳出循环
a[position+dataLength]=a[position];
position = position - dataLength; //确定与temp比较的下一个数的位置
change = true;
if(position<0||position>index){
break; //超出数组索引
}
}
a[position+dataLength]=temp; //交换位置
if(change){
System.out.print("排序中: ");
for (int j = 0; j < index; j++) {
System.out.printf("%3s", a[j]);
System.out.print("");
}
System.out.println();
}
}
dataLength=dataLength/2;
}
}
}
排序结果: