博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
十七、自己动手实现排序算法(5)-------- “ Shell Sort 希尔排序 ”
阅读量:2052 次
发布时间:2019-04-28

本文共 2984 字,大约阅读时间需要 9 分钟。

参考文章:

希尔排序就这么简单


希尔排序分析:

平均时间复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性
O(n*logn) O(n*log2 n) O(n*log2 n) O(1) In-place 不稳定

希尔排序原理:

          我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

 

希尔排序算法描述:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:

  • 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列个数k,对序列进行k 趟排序;
  • 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

 

希尔排序原理图:

 

 

Java 代码实现:

代码一:

package com.sorting.algorithm;	public class ShellSort {		 public static void sort(Comparable[] arr){	        int n = arr.length;	        // 计算 increment sequence: 1, 4, 13, 40, 121, 364, 1093...	        int h = 1;	        while (h < n/3) h = 3*h + 1;	        while (h >= 1) {	            // h-sort the array	            for (int i = h; i < n; i++) {	                // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序	                Comparable e = arr[i];	                int j = i;	                for ( ; j >= h && e.compareTo(arr[j-h]) < 0 ; j -= h)	                    arr[j] = arr[j-h];	                arr[j] = e;	            }	            h /= 3;	        }		}		public static  void printArr(Comparable[] array){			for (int i = 0; i < array.length; i++) {				if(i != array.length-1)					System.out.print(array[i] + ",");				else					System.out.println(array[i]);			}			System.out.println();		}				public static void main(String[] args) {			Comparable[] array = { 58,36,70,22,88,64,1,32 };			System.out.println("排序之前:");			printArr(array);			System.out.println("-------------------------------");						System.out.println("排序过程");			sort(array);						System.out.println("-------------------------------");			System.out.println("排序之后:");			printArr(array);					}}

 

代码二:

package com.sorting.algorithm;	public class ShellSort2 {		public static int[] shellSort(int[] array) {        int len = array.length;        int temp, gap = len / 2;        while (gap > 0) {            for (int i = gap; i < len; i++) {                temp = array[i];                int preIndex = i - gap;                while (preIndex >= 0 && array[preIndex] > temp) {                    array[preIndex + gap] = array[preIndex];                    preIndex -= gap;                }                array[preIndex + gap] = temp;            }            gap /= 2;        }        return array;    }	public static  void printArr(int[] array){		for (int i = 0; i < array.length; i++) {			if(i != array.length-1)				System.out.print(array[i] + ",");			else				System.out.println(array[i]);		}		System.out.println();	}			public static void main(String[] args) {		int[] array = { 58,36,70,22,88,64,1,32 };		System.out.println("排序之前:");		printArr(array);		System.out.println("-------------------------------");				System.out.println("排序过程");		shellSort(array);				System.out.println("-------------------------------");		System.out.println("排序之后:");		printArr(array);			}	}

 

 

希尔排序代码测试:

 

代码一:

 

代码二:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://fzylf.baihongyu.com/

你可能感兴趣的文章
阿里宣布拆中台,首当其冲就是优化数据中台架构?
查看>>
Cilium 源码解析:Node 之间的健康探测(health probe)机制
查看>>
前几天是谁说 WireGuard 不香的?看我今天怎么怼你
查看>>
配置 containerd 镜像仓库完全攻略
查看>>
iTerm 2 使用触发器和 expect 实现 ssh 自动登录
查看>>
Kubernetes Pod 突然就无法挂载 Ceph RBD 存储卷了。。
查看>>
解决 Kubernetes 部署 Metrics Server 无法访问 Apiserver 问题
查看>>
AWS 容器三大新品:K8s 发行版,免费镜像库和 “Game Changer”AWS Proton
查看>>
多平台容器镜像构建就看这一篇
查看>>
macOS Big Sur 使用全新虚拟化框架创建超轻量虚拟机!
查看>>
16 岁高中生成功在 iPhone 7 上安装 Ubuntu 20.04 桌面!
查看>>
两个程序都要用同一个端口,怎么解?
查看>>
有了这款图形管理界面,一分钟内配置 10 个 WireGuard 客户端不是梦
查看>>
Containerd镜像lazy-pulling解读
查看>>
Grafana 教程 - 构建你的第一个仪表盘
查看>>
由 OOM 引发的 ext4 文件系统卡死
查看>>
什么?WireGuard 可以让躲在 NAT 后面的客户端之间直连了??
查看>>
k8s集群内的节点,可能没你想象的那么健壮!(磁盘管理篇)
查看>>
利用 ebpf sockmap/redirection 提升 socket 性能(2020)
查看>>
春节前最后一波福利,Alibaba Java 训练营]5天突破面向对象编程限时免费报名!...
查看>>