3.5排序算法之希尔排序(属于插入排序)
思路:
第一轮
1.先用数组长度/2等于一个值,该值就是区间的步长(做为比较)
- 9 / 2 = 4
2.让每个部分都做一个插入排序
- 第一部分的比较:
- 后续部分一样,都做一次插入排序
第二轮
1.在将除过的值/2等于一个值,该值就是区间的步长(做为比较)
- 4 / 2 = 2
2.让每个部分都做一个插入排序
- 第一部分的比较:
- 第二部分的比较:
第三轮
1.在将除过的值/2等于一个值,该值就是区间的步长(做为比较)
- 2 / 2 = 1
2.让每个部分都做一个插入排序
最后就可以得出结果了!
代码:
package main.java.com.LiKou.arithmetic;
import java.util.Arrays;
/**
* 希尔排序:
* 比直接插入排序的效率高
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr = new int[]{3, 7, 8, 2, 1, 4, 6, 9, 0};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void shellSort(int[] arr){ //希尔排序
//遍历所有的步长
for(int d = arr.length / 2; d > 0; d /= 2){
//遍历所有的元素
for(int i = d; i < arr.length; i++){
//遍历本组中所有的元素
for(int j = i - d; j >= 0; j -= d){
//如果当前元素大于加上步长后的元素
if(arr[j] > arr[j + d]){
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
}
}
}