希尔排序,又称缩减增量排序。
核心思想:希尔排序是通过分组(拆半分组),通过组内排序,每次分组后分组间隔再一次拆半,一直循环下去,找到分组间隔gap=1,使用直接插入排序完成最后的排序。
图解:
希尔排序的时间复杂度是:O(n2) ;空间复杂度是O(1) ,希尔排序是一个不稳定的排序,相同的变量在排序后可能与之前的顺序不一样。
比如:初始的数组为:6,7,5(1),9,1,2,4,5(2)。
通过希尔排序之后,序列为:1,2,4,5(2),5(1),6,7,9
排序前的5(1)在5(2)的前面,排序过后,5(1)在5(2)的后面。所以,希尔排序是一个不稳定的排序。
JAVA代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int []data = new int[8];
for(int i= 0;i<data.length ;i++){
data[i] = sc.nextInt();
}
data = shell(data);
for(int i = 0;i<data.length ;i++){
System.out.print(data[i]+" ");
}
}
//希尔排序的算法实现
public static int[] shell(int[] arrays){
if(arrays == null || arrays.length <= 1){
return arrays;
}
//增量
int incrementNum = arrays.length/2;
while(incrementNum >=1){
for(int i=0;i<arrays.length;i++){
//进行插入排序
for(int j=i;j<arrays.length-incrementNum;j=j+incrementNum){
if(arrays[j]>arrays[j+incrementNum]){
int temple = arrays[j];
arrays[j] = arrays[j+incrementNum];
arrays[j+incrementNum] = temple;
}
}
}
//设置新的增量
incrementNum = incrementNum/2;
}
return arrays;
}
}