小思路:
希尔排序是把数组按照下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个元素恰被分成一组,算法便终止。
算法思想:
通过增量对数组进行分组排序,例:数组长度为10的话,10 /2 增量为 5,第一组元素下标0,5,10……,第二组 1,6 ,11……, 以此类推然后对每组内进行插入排序
分组:增量=数组长度/2,每组进行插入排序,然后交换位置,再缩小增量,分组再插入排序,增量越来越小,每组元素越多,当增量减至1时,整个元素恰被分成一组,算法便终止。
最外层循环循环的是增量,每轮/2, 当等于 1 时结束算法。
代码示例:
public class ShellSort {
// 希尔排序
// 通过增量对数组进行分组排序,例:数组长度为10的话,10 /2 增量为 5,第一组元素下标0,5,10……,
// 第二组 1,6 ,11……, 以此类推然后对每组内进行插入排序
// 分组:增量=数组长度/2,每组进行插入排序,然后交换位置,再缩小增量,分组再插入排序,
// 增量越来越小,每组元素越多,当增量减至1时,整个元素恰被分成一组,算法便终止。
// 希尔排序方法,接收一个数组
public static void shellSort(int[] arr){
int len=arr.length;//拿到数组长度
//外层循环控制增量,最常用的是一开始 增量/2
for(int gap=len/2;gap>0;gap/=2){ //gap 为 1 时 即可结束算法因此gap>0,,每轮增量减少 gap/2
//插入排序时从后跟前进行比较排序。。。
//每趟从分组后每组的后一个开始跟前面比较//每组后一个即为 gap,
for(int i=gap;i<arr.length;i++){
//每次每组的后一个跟前一个元素比较//每组前一个元素就是当前元素减去增量,
for(int k=i;k>=gap;k-=gap){
//判断每组元素大小
if(arr[k]>arr[k-gap]){
swap(arr,k,k-gap);
}else{
break; //大小位置合适,不需要交换则 break
}
}
}
}
}
//交换两个变量
public static void swap(int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
public static void main(String[] args) {
int arr[]={1,2,5,7,3,12,8,43,8756,34,2};
//调用希尔排序
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
}