希尔排序(王道书思想Java实现)
希尔排序是基于插入排序的改进,插入排序在处理基本有序的排序表时速度较快,因而希尔排序的主要思想是在插排之前,让数组尽可能地有序。首先将间隔一个初始步长位置的子表利用插排排序为有序表,然后不断缩小步长再进行插排,直到最后步长为1,排序结束。
public void ShellSort(int A[],int n){
for(int dk=n/2;dk>=1;dk=dk/2){ //步长由长度的一半减到1
for(int i=dk;i<n;i++){ //与书上不同,不采用A[0]做暂存位,A[0]参与排序,因而i初始值设为dk
if(A[i]<A[i-dk]){ //类似插入排序思想,当前位置的数字比之前的隔一个步长的位置的数字小,则应该调整位置
int temp=A[i],j=0; //temp存储要挪动位置的A[i]
for(j=i-dk;j>=0&&temp<A[j];j-=dk) //寻找插入位置
A[j+dk]=A[j];
A[j+dk]=temp;
}
}
}
}