1. 希尔排序介绍
2. 希尔排序思路
3. 代码实现
3.1 交换法
希尔排序推导过程:
public class ShellSort {
public static void main(String[] args) {
int[] arr = {8,9,1,7,2,3,5,4,6,0};
System.out.println("排序前:"+Arrays.toString(arr));
shellSort(arr);
}
public static void shellSort(int[] arr){
int temp=0;
//第一轮排序:将10个数据分成5组
for(int i=5;i<arr.length;i++){
//如果当前元素大于步长后面的那个元素,说明交换
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("第1轮:");
System.out.println(Arrays.toString(arr));
//第2轮排序:将10个数据分成2组
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("第2轮:");
System.out.println(Arrays.toString(arr));
//第2轮排序:将10个数据分成1组
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("第3轮:");
System.out.println(Arrays.toString(arr));
}
}
使用for循环简化代码:
public class ShellSort {
public static void main(String[] args) {
int[] arr = {8,9,1,7,2,3,5,4,6,0};
System.out.println("排序前:"+Arrays.toString(arr));
shellSort(arr);
}
public static void shellSort(int[] arr){
for(int gap = arr.length/2;gap>0;gap/=2){
int temp=0;
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;
}
}
}
System.out.println("第"+gap+"轮:");
System.out.println(Arrays.toString(arr));
}
}
}
3.2 移动法
//对交换式的希尔排序进行优化,移动法
public static void shellSort2(int[] arr){
//增量gap
for(int gap = arr.length/2;gap>0;gap/=2){
//从第gap个元素,逐步对其所在的组进行直接插入排序
for(int i=gap;i<arr.length;i++){
int j = i;
int temp = arr[j];
if(arr[j]<arr[j-gap]){
while (j-gap>=0 && temp<arr[j-gap]){
arr[j]= arr[j-gap];
j-=gap;
}
//退出循环后,就给gap找到了插入的位置
arr[j] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
来源:CSDN
作者:茶花女-
链接:https://blog.csdn.net/qq_42764468/article/details/103755712