package com.xurong.sort;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] array = {8,9,1,7,2,3,5,4,6,0};
System.out.println("原始数据为:\n" + Arrays.toString(array));
shellSort(array);
}
/**
* 希尔排序推导理解
* 逐步利用2分法进行分组,每组内部采用插入排序进行排序
* @param array
*/
public static void shellSort(int[] array) {
//希尔排序第1趟
int temp = 0;//存储临时变量
//10个数据分为5组,在每组内部进行插入排序,尽可能的将小的数往前面放
for (int i = 5; i < array.length; i++) {//5 == array.length/2
//遍历各组中所有元素(共5组,每组2个元素),步长为5
for (int j = i - 5; j >= 0; j -= 5) {
//在每一组中,如果当前元素大于加上步长之后的元素,就需要运用插入排序交换
if (array[j] > array[j + 5]) {
temp = array[j];
array[j] = array[j + 5];
array[j + 5] = temp;
}
}
}
System.out.println("第1趟排序结果为:\n" + Arrays.toString(array));
//希尔排序第2趟
//10个数据分为2组,在每组内部进行插入排序,尽可能的将小的数往前面放
for (int i = 2; i < array.length; i++) {//2 == (array.length/2)/2
//遍历各组中所有元素(共5组,每组2个元素),步长为5
for (int j = i - 2; j >= 0; j -= 2) {
//在每一组中,如果当前元素大于加上步长之后的元素,就需要运用插入排序交换
if (array[j] > array[j + 2]) {
temp = array[j];
array[j] = array[j + 2];
array[j + 2] = temp;
}
}
}
System.out.println("第2趟排序结果为:\n" + Arrays.toString(array));
//希尔排序第3趟
//10个数据分为1组,在每组内部进行插入排序,尽可能的将小的数往前面放
for (int i = 1; i < array.length; i++) {//1 == ((array.length/2)/2)/2
//遍历各组中所有元素(共5组,每组2个元素),步长为5
for (int j = i - 1; j >= 0; j -= 1) {
//在每一组中,如果当前元素大于加上步长之后的元素,就需要运用插入排序交换
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
System.out.println("第3趟排序结果为:\n" + Arrays.toString(array));
}
}
输出结果:
原始数据为:
[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
第1趟排序结果为:
[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
第2趟排序结果为:
[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
第3趟排序结果为:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]