Java排序算法之希尔算法
希尔算法是插入排序的一种优化算法,也叫缩小增量排序。希尔排序的基本思路是将待排序数组元素按下标的一定增量分组,然后将每组分别进行直接插入排序。随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个数组恰被分成一组,此时算法终止。
做法
在希尔排序中,先将待排数组按照一定的增量分割成若干个子序列(下标间隔为增量)分别进行插入排序,然后逐渐减小增量,重复上述过程,直至增量为1(即最后一次按下标相邻的单个元素作为子序列进行插入排序),整个数组排序完成。
下面代码展示了希尔排序的实现:
public static void shellSort(int[] array) {
int len = array.length;
int temp, gap = len / 2;
while (gap > 0) {
for (int i = gap; i < len; i++) {
temp = array[i];
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
}
其中len
表示待排序数组长度,gap
表示增量,每次将gap
值减小一半,并进行插入排序。
示例
下面通过两个示例来说明希尔排序的过程:
示例一
假设待排序数组为{2, 5, 1, 9, 4, 6, 7, 3, 8}
,按照希尔排序的步骤排列如下:
第一次增量为4
,将数组分为四组,分别排序:
2 5 1 9 4 6 7 3 8
↓
4 6 8
↓
2 5 1
↓
7 3 9
排列后的数组为{2, 3, 1, 9, 4, 5, 7, 6, 8}
,此时gap
变为2
。
第二次增量为2
,将数组分为两组,分别排序:
2 3 1 9 4 5 7 6 8
↓
1 3 5 6 8 9
↓
2 4 7
排列后的数组为{1, 3, 2, 9, 4, 5, 7, 6, 8}
,此时gap
变为1
。
第三次增量为1
,按插入排序的方法排序,
1 3 2 9 4 5 7 6 8 // 将 1 插入到已排序序列中
1 2 3 9 4 5 7 6 8 // 将 2 插入到已排序序列中
1 2 3 4 9 5 7 6 8 // 将 4 插入到已排序序列中
1 2 3 4 5 9 7 6 8 // 将 5 插入到已排序序列中
1 2 3 4 5 7 9 6 8 // 将 7 插入到已排序序列中
1 2 3 4 5 7 6 9 8 // 将 6 插入到已排序序列中
1 2 3 4 5 7 6 8 9 // 将 8 插入到已排序序列中
排列后的数组为{1, 2, 3, 4, 5, 6, 7, 8, 9}
,排序完成。
示例二
假设待排序数组为{3, 2, 6, 5, 4, 1, 9, 8, 7}
,按照希尔排序的步骤排列如下:
第一次增量为4
,将数组分为四组,分别排序:
3 2 6 5 4 1 9 8 7
↓
4 7
↓
3 1
↓
9 6
↓
2 5
排列后的数组为{3, 2, 6, 5, 4, 1, 7, 1, 9, 6, 2, 5, 4, 8, 3}
,此时gap
变为2
。
第二次增量为2
,将数组分为两组,分别排序:
3 2 6 5 4 1 7 1 9 6 2 5 4 8 3
↓
6 1 9 5 8 3
↓
3 2 4 1 7 6
排列后的数组为{3, 2, 1, 5, 4, 1, 8, 6, 7, 5, 9, 2, 4, 6, 3}
,此时gap
变为1
。
第三次增量为1
,按插入排序的方法排序,
3 2 1 5 4 1 8 6 7 5 9 2 4 6 3 // 将 2 插入到已排序序列中
2 3 1 5 4 1 8 6 7 5 9 2 4 6 3 // 将 3 插入到已排序序列中
1 2 3 5 4 1 8 6 7 5 9 2 4 6 3 // 将 4 插入到已排序序列中
1 2 3 4 5 1 8 6 7 5 9 2 6 4 3 // 将 1 插入到已排序序列中
1 2 3 4 5 1 8 6 7 5 9 2 6 4 3 // 将 5 插入到已排序序列中
1 2 3 4 1 5 8 6 7 5 9 2 6 4 3 // 将 1 插入到已排序序列中
1 2 3 4 1 5 8 6 7 5 9 2 6 4 3 // 将 8 插入到已排序序列中
1 2 3 4 1 5 6 6 7 5 9 2 8 4 3 // 将 8 插入到已排序序列中
1 2 3 4 1 5 6 6 7 5 9 2 8 4 3 // 将 7 插入到已排序序列中
1 2 3 4 1 5 6 6 5 7 9 2 8 4 3 // 将 5 插入到已排序序列中
1 2 3 4 1 5 6 6 5 7 9 2 8 4 3 // 将 9 插入到已排序序列中
1 2 3 4 1 5 6 6 5 7 2 8 4 3 9 // 将 2 插入到已排序序列中
1 2 3 4 1 5 6 6 5 7 2 8 4 3 9 // 将 6 插入到已排序序列中
1 2 3 4 1 5 2 6 5 7 6 8 4 3 9 // 将 4 插入到已排序序列中
1 2 3 4 1 5 2 6 5 7 6 8 4 3 9 // 将 3 插入到已排序序列中
排列后的数组为{1, 2, 3, 4, 1, 5, 2, 6, 5, 7, 6, 8, 4, 3, 9}
,排序完成。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 排序算法之希尔算法 - Python技术站