上一节我们了解的插入排序。插入排序适用于数据规模小或整体较有序的数组,不适用于数据规模大且无序的数组(开销大),希尔排序正好解决了这个问题。
1.核心思想
将较大数组分割为多个较小数组,然后对较小数组执行插入排序,提高效率。
1.1 选定增量1:8/2 = 4,起始增量为数组长度的一半,逐步减半
增量为3,则可分为3组
数组 | 1 | 6 | 5 | 3 | 7 | 2 | 9 | 4 |
---|---|---|---|---|---|---|---|---|
第一组 | 1 | 7 | ||||||
第二组 | 6 | 2 | ||||||
第三组 | 5 | 9 | ||||||
第四组 | 3 | 4 |
1.2 插入排序
数组 | 1 | 6 | 5 | 3 | 7 | 2 | 9 | 4 |
---|---|---|---|---|---|---|---|---|
第一组 | 1 | 7 | ||||||
第二组 | 2 | 6 | ||||||
第三组 | 5 | 9 | ||||||
第四组 | 3 | 4 | ||||||
排序后 | 1 | 2 | 5 | 3 | 7 | 6 | 9 | 4 |
1.3 增量减半: 4/2 = 2
增量为2时,能分为2组
数组 | 1 | 2 | 5 | 3 | 7 | 6 | 9 | 4 |
---|---|---|---|---|---|---|---|---|
第一组 | 1 | 5 | 7 | 9 | ||||
第二组 | 2 | 3 | 6 | 4 |
1.4 插入排序
数组 | 1 | 2 | 5 | 3 | 7 | 6 | 9 | 4 |
---|---|---|---|---|---|---|---|---|
第一组排序 | 1 | 5 | 7 | 9 | ||||
第二组排序 | 2 | 3 | 4 | 6 | ||||
排序后 | 1 | 2 | 5 | 3 | 7 | 4 | 9 | 6 |
1.5 增量减半: 2/2 = 1
增量为1时,能分为1组
数组 | 1 | 2 | 5 | 3 | 7 | 4 | 9 | 6 |
---|
1.6 插入排序
数组 | 1 | 2 | 5 | 3 | 7 | 4 | 9 | 6 |
---|---|---|---|---|---|---|---|---|
排序后 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
2.代码实现
先附上一个好用的在线Java编译工具:https://www.jdoodle.com/online-java-compiler/
import java.util.Arrays;
public class InsertionSort{
public static void main(String[] args){
int[] array = {1,6,5,3,7,2,9,4};
System.out.println("排序前:"+Arrays.toString(array));
sort(array);
}
public static void sort(int[] array){
//增量减半
for(int gap = array.length/2; gap >0; gap /= 2){
//分组
for(int i = 0 ; i > 0 && arr[i] < arr[gap] ; i++){
//插入排序
/* 未完待续
for(){
if(array[i] > array[i+1]){
changePosition(array, j , j-1);
System.out.println("排序后:"+Arrays.toString(array));
}
}
*/
}
}
}
public static void changePosition(int[] array, int a , int b){
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
}
3.性能分析
时间复杂度:O(n²) ,
空间复杂度:O(1)
稳定性:不稳定。
欢迎各位评论交流指点,您的每一分评论和关注都是对我的莫大鼓励!
如果对各位大佬有帮助,也请点个赞吧hhhh~
祥哥的说,《希尔排序–简单易懂图解》 ↩︎