希尔排序思想
希尔排序也是一种插入排序,它是简单插入排序经过改进后的一个更高效的版本,也称为缩小增量排序。
它的基本思想是:
对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;
然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。
然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。
举例
代码编写
演变过程代码
public static void main(String[] args) {
int arr[] = {5,8,6,3,9,2,1,7};
System.out.println("排序前: " + Arrays.toString(arr));
int temp;
for (int i = 4; i < arr.length; i++){
for (int j = i -4; j >= 0; j-=4){
if(arr[j] > arr[j+4]){
temp = arr[j];
arr[j] = arr[j+4];
arr[j+4] = temp;
}
}
}
System.out.println("排序: " + Arrays.toString(arr));
for (int i = 2; i < arr.length; i++){
for (int j = i -2; j >= 0; j-=2){
if(arr[j] > arr[j+2]){
temp = arr[j];
arr[j] = arr[j+2];
arr[j+2] = temp;
}
}
}
System.out.println("排序: " + Arrays.toString(arr));
for (int i = 1; i < arr.length; i++){
for (int j = i -1; j >= 0; j-=1){
if(arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("排序: " + Arrays.toString(arr));
}
封装演变过程
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int arr[] = {5, 8, 6, 3, 9, 2, 1, 7};
System.out.println("排序前: " + Arrays.toString(arr));
arr = shellSort(arr);
System.out.println("排序后: " + Arrays.toString(arr));
}
private static int[] shellSort(int[] arr){
int temp;
for (int gap = arr.length/2; gap>=1; 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]){
temp = arr[j];
arr[j] = arr[j+gap];
arr[j+gap] = temp;
}
}
}
}
return arr;
}
}