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));
// shellSort1(array);
shellSort2(array);
}
/**
* 希尔排序---交换法(效率较低)
* @param array
*/
public static void shellSort1(int[] array) {
int k = 1;//记录希尔排序第k趟
for (int group = array.length/2; group > 0; group /= 2) {
int temp = 0;//存储临时变量
//10个数据分为5组,在每组内部进行插入排序,尽可能的将小的数往前面放
for (int i = group; i < array.length; i++) {//5 == array.length/2
//遍历各组中所有元素(共5组,每组2个元素),步长为5
for (int j = i - group; j >= 0; j -= group) {
//在每一组中,如果当前元素大于加上步长之后的元素,就需要运用插入排序交换
if (array[j] > array[j + group]) {
temp = array[j];
array[j] = array[j + group];
array[j + group] = temp;
}
}
}
System.out.println("第"+(k++)+"趟排序结果为:\n" + Arrays.toString(array));
}
}
/**
* 希尔排序--移位法(效率较高)
* @param array
*/
public static void shellSort2(int[] array) {
int k = 1;//记录希尔排序第k趟
for (int group = array.length/2; group > 0; group /= 2) {
//将数据分组--eg:10个数据,先划分为5组,在划分为2组,再划分为1组
//group:分为几组,同时也为步长
for (int i = group; i < array.length; i++) {
//以下代码是对每一组直接运用插入排序(即移位)
int j = i;
int temp = array[j];
if (array[j] < array[j - group]) {//算法优化之处
while((j - group) >= 0 && temp < array[j - group]) {
array[j] = array[j - group];//将前面的值复制给后面的值,起到的作用是数组值后移的目的(参考插入排序)
j -= group;
}
//当退出while循环时,array[i]所对应的值已经找到所插入的位置
array[j] = temp;
}
}
System.out.println("第"+(k++)+"趟排序结果为:\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]
移位法输出结果:
原始数据为:
[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]