本文由广州疯狂软件java培训分享:
希尔排序是在插入排序的基础上进行优化,主要是减少插入次数。 例子中使用的待排序数据 {3, 32, 1, 55, 0, 3, 9}排序规则是从左到右,从小到大排序,正确排序的结果:{0, 1, 3, 3, 9, 32, 55}
一、希尔排序源码
public class ShellSort {
public void shellSort(int array[]) {
if (array == null) {
throw new NullPointerException();
}
// 1 选择步长
for (int gap = array.length / 2; gap > 0; gap/=2) {
// 2 对所有组进行遍历
for (int i = 0; i < gap; i++) {
// 3 遍历组内所有元素
for (int j = i + gap; j < array.length; j += gap) {
// 4 组内元素比较大小
if (array[j - gap] > array[j]) {
// 5 插入排序
int insertValue = array[j];
int k = j - gap;
while (k >= 0 && array[k] > insertValue) {
array[k + gap] = array[k];
k -= gap;
}
array[k + gap] = insertValue;
}
}
}
}
}
public static void main(String[] args) {
int[] array = {3, 32, 1, 55, 0, 3, 9};
ShellSort shellSort = new ShellSort();
shellSort.shellSort(array);
System. out.println( Arrays.toString( array ) );
}
}
二、希尔排序逐步解释
1. 选择步长
for (int gap = array.length / 2; gap > 0; gap/=2) {}
什么是步长? 相隔几个元素进行比较,如果步长的规则是 gap = array.length / 2, gap /= 2; 每次都除以2,例子的步长选择就是: 数组长度 length = 7,所有步长分别是 3, 1 gap = 7/2 = 3 gap = 3/2 = 1
2. 对所有组进行遍历
for (int i = 0; i < gap; i++) {}
当前操作是嵌套在1中,即步长为3的时候执行一次,步长为1的时候执行一次。1中计算出步长(gap)的值分别是3, 1。
gap取值 i取值
3 0,1,2
1 1
疯狂软件教育中心依托开发团队的强大技术实力,把企业最新技术融入实训课程,打造金牌的品质,才能给予学员黄金的未来,疯狂软件凭借过硬的技术实力与丰富的项目开发经验,赢得了社会的肯定。疯狂软件Java培训师资力量强大,课程内容深入,为学员高薪就业做了很好的铺垫,拥有丰富就业指导经验的就业团队也成为了学员高薪就业的先天优势。地址:广州天河区车陂沣宏大厦3楼。