希尔排序
直接插入排序算法简单,但时间性能为O(n^2),对于此性能,显然当n较小时比n较大时效率要好,对于直接插入排序方法,若排序表初始状态的关键码有序性较好,该算法的效率较高,其时间效率可提高到O(n)。希尔排序(Shell Sort)是从这两点出发,给出插入排序的改进方法。希尔排序又称缩小增量排序,是1959年由D.L.Shell提出的。
希尔排序的思想是:先选取一个小于n的整数di(称之为步长),然后把排序表中的n个记录分为di个组,从第一个记录开始,间隔为di的记录为同一组,各组内进行直接插入排序,一趟之后,间隔di的记录有序,随着有序性的改善,减小步长di,重复进行,直到di=1,使得间隔为1的记录有序,也就使整体达到了有序。
代码展示
package demo4;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] arr = new int[]{5,4,6,3,8,9,4,1,7,2,6};
System.out.println("排序前:"+Arrays.toString(arr));
shellSort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
public static void shellSort(int[] arr){
int k = 1;
//遍历所有的步长
for(int d=arr.length/2;d>0;d/=2){
//遍历所有元素
for(int i=d;i<arr.length;i++){
//遍历本组中所有的元素
for(int j=i-d;j>=0;j-=d){
//如果当前元素大于加上步长后的那个元素
if(arr[j]>arr[j+d]){
int temp = arr[j];
arr[j] = arr[j+d];
arr[j+d] = temp;
}
}
}
//查看每次排序后的结果
System.out.println("第"+k+"次排序结果:"+Arrays.toString(arr));
k++;
}
}
}