希尔排序法,是D.L.Shell在1959年7月发明的一种排序法.
原理上,有点像插入排序法,但它可以减少数据搬移的次数.排序的原则是将数据分成特定间隔的几个小区块,以插入排序法拍完区块内的数据,再渐渐减少间隔的距离.
算法分析:
- 任何情况下,时间复杂度均为O(n3/2).
- 希尔排序法和插入排序法一样,都是稳定排序
- 只需要一个额外的空间,所以空间复杂度最佳
- 此排序法适用于数据大部分都已经排序完成的情况
import java.util.Random; /** * 算法大神之路----排序(希尔排序法) */ public class Study04 { public static void main(String[] args) { //新建一个数组 int[] arr = new int[20]; Random r = new Random(); for (int i = 0; i < arr.length; i++) { //使用随机数给数组赋值 arr[i] = r.nextInt(50); } System.out.print("原数组为:"); paint(arr); System.out.println("-----排序-----"); int i;//扫描次数 int j;//以j来定为比较元素 int k=1; int tmp;//用k来暂存数据 int jmp;//jmp用来设定间隔的位移量 jmp=arr.length/2; while (jmp!=0){ for (i = jmp; i <arr.length ; i++) { tmp=arr[i]; j=i-jmp; while (j>=0&&tmp<arr[j]){ arr[j+jmp]=arr[j]; j=j-jmp; } arr[jmp+j]=tmp; } System.out.print("第"+(k++)+"次排序"); paint(arr); jmp=jmp/2; } System.out.print("排序结束后,数组为:"); paint(arr); } //遍历打印出数组的数据 public static void paint(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+"\t"); } System.out.println(); } }
控制台输出语句: