1.思路:
打破只能相邻元素比较的局限,以可变间距比较两个元素的大小,可变间距以数组长度的二分之一开始,直至变为1结束。通过多轮不同间距的比较之后,数组变得有序。
2.图片演示:
3.代码示例:
package sort;
import java.util.Arrays;
/**
* 希尔排序
*
*/
public class Shell {
public static void main(String[] args) {
int[] arr1 = {44,38,5,47,15,31,32,88,2,23,43,54,1,7,56,100,101,102};
shell(arr1);
}
/**
* 希尔排序的特点就是比较和交换不局限于相邻元素,而是以一定的间隔(可变的)来进行。
* @param arr
*/
public static void shell(int[] arr) {
int compareCount=0;
int swapCount=0;
for(int gap=arr.length/2;gap>0;gap/=2) {
for(int i=gap;i<arr.length;i++) {
for(int j=i-gap;j>=0;j-=gap) {
if(arr[j]>arr[j+gap]) {
int temp=arr[j];
arr[j]=arr[j+gap];
arr[j+gap]=temp;
swapCount++;
}
compareCount++;
}
}
}
System.out.println(Arrays.toString(arr));
System.out.println(String.format("比较%d次", compareCount));
System.out.println(String.format("交换%d次", swapCount));
}
}