希尔排序
希尔排序就是针对直接插入排序的优化
插入排序在近乎有序的数组上性能·非常好或者在小数据规模的集合中性能也很好
于是先将数组调整得近乎有序,然后使用插入排序--------希尔排序的核心思想!!!
具体操作
先选定一个整数(gap)分组(所有距离为gap的元素在同一组),对同一组元素进行排序。不断缩小这个gap的长度(gap/=2,gap/=3)重复上述分组与排序过程,当gap==1时,其实整个数组已经近乎有序了,最后再来一次全组的插入排序整个集合就变得有序了。
注意:(gap/=2,gap/=3):是经过论证得来的并不是随便写的
public static void shellSort(int[] arr) {
int gap = arr.length >> 1;
// 当gap > 1都是分组,组内进行排序
while (gap > 1) {
// 组内进行插入排序
insertionSortByGap(arr,gap);
gap = gap >> 1;
}
// 当gap == 1时,其实整个数组近乎有序,整体来一次插入排序即可
insertionSortByGap(arr,1);
}
private static void insertionSortByGap(int[] arr, int gap) {
for (int i = gap; i < arr.length; i++) {
// j和j - gap是同一组的元素,利用gap这个值来进行分组的
for (int j = i; j - gap >= 0 && arr[j] < arr[j - gap]; j -= gap) {
swap(arr,j,j - gap);
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
希尔排序的本质:普通的插入排序,每次向前看一个元素
按照gap分组的插入排序,每次向前看gap步的元素,j-jap和j才是同一组元素
如果gap==1,就变成了普通的插入排序!!!!