基本思想:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。代码实现:
分步演示:package shellSort;
import java.util.Arrays;
public class shellsort {
public static void main(String[] args) {
int arr[] = {8,9,1,7,2,3,5,4,6,0};
shellSort(arr);
}
public static void shellSort(int[] arr) {
int temp = 0;
//希尔排序的第一轮
for(int i=5;i<arr.length;i++) {
//遍历个组中的元素(共五组每组两个元素),步长为5
for(int j=i-5;j>=0;j-=5) {
//如果当前元素大于加上步长后的那个元素,说明交换
if(arr[j]>arr[j+5]) {
temp = arr[j];
arr[j] = arr[j+5];
arr[j+5] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
//第二轮
for(int i1=2;i1<arr.length;i1++) {
for(int j1=i1-2;j1>=0;j1-=2) {
if(arr[j1]>arr[j1+2]) {
temp = arr[j1];
arr[j1] = arr[j1+2];
arr[j1+2] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
//第三轮
for(int i2=1;i2<arr.length;i2++) {
for(int j2=i2-1;j2>=0;j2-=1) {
if(arr[j2]>arr[j2+1]) {
temp = arr[j2];
arr[j2] = arr[j2+1];
arr[j2+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
综合:
package shellSort;
import java.util.Arrays;
public class shellsort {
public static void main(String[] args) {
int arr[] = {8,9,1,7,2,3,5,4,6,0};
shellSort(arr);
}
public static void shellSort(int[] arr) {
int temp = 0;
//综合
for(int m=arr.length/2;m>0;m/=2) {
for(int n=m;n<arr.length;n++) {
//遍历个组中的元素(共五组每组两个元素),步长为5
for(int k=n-m;k>=0;k-=m) {
//如果当前元素大于加上步长后的那个元素,说明交换
if(arr[k]>arr[k+m]) {
temp = arr[k];
arr[k] = arr[k+m];
arr[k+m] = temp;
}
}
}
}
System.out.println(Arrays.toString(arr));
}
}