博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
希尔排序
阅读量:6279 次
发布时间:2019-06-22

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

hot3.png

package com.victor.sort.algorithms;import java.util.ArrayList;import com.victor.sort.seeds.*;/** * 希尔排序 * @author 黑妹妹牙膏 * */public class Shell extends SortAlgorithms {	/**	Algorithm	h = 1	while h < n, h = 3*h + 1	while h > 0,	    h = h / 3	    for k = 1:h, insertion sort a[k:h:n]	    → invariant: each h-sub-array is sorted	end	Properties	■Not stable 	■O(1) extra space 	■O(n3/2) time as shown (see below) 	■Adaptive: O(n·lg(n)) time when nearly sorted 	Discussion	The worse-case time complexity of shell sort depends on the increment sequence. For the increments 1 4 13 40 121..., which is what is used here, the time complexity is O(n3/2). For other increments, time complexity is known to be O(n4/3) and even O(n·lg2(n)). Neither tight upper bounds on time complexity nor the best increment sequence are known. 	Because shell sort is based on insertion sort, shell sort inherits insertion sort's adaptive properties. The adapation is not as dramatic because shell sort requires one pass through the data for each increment, but it is significant. For the increment sequence shown above, there are log3(n) increments, so the time complexity for nearly sorted data is O(n·log3(n)). 	Because of its low overhead, relatively simple implementation, adaptive properties, and sub-quadratic time complexity, shell sort may be a viable alternative to the O(n·lg(n)) sorting algorithms for some applications when the data to be sorted is not very large. 	*/		@Override	protected ArrayList
 doSort(ArrayList
 Alist) { ArrayList
 a = Alist; int n = a.size(); int h = 1; while(h
0) { h=h/3; int j; for(int i = h; i < n; i++) {    int temp = a.get(i); for(j = i; j >= h && temp<(a.get(j - h)); j -= h) {    a.set(j, a.get(j-h));    }         a.set(j,temp); moveMentIncrease(); } } return a; } @Override public String getName() { return "Shell"; } public static void main(String[] args) { Seeds seed1 = new Random(); Seeds seed2 = new NearSorted(); Seeds seed3 = new Reversed(); Seeds seed4 = new FewUniqueKeys(); SortAlgorithms SA = new Shell(); SA.sort(seed1,10000); //SA.print(); SA.sort(seed2,10000); SA.sort(seed3,10000); SA.sort(seed4,10000); }}

转载于:https://my.oschina.net/readjava/blog/304448

你可能感兴趣的文章
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>
企业中最佳虚拟机软件应用程序—Parallels Deskto
查看>>
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>
Spring配置文件(2)配置方式
查看>>
MariaDB/Mysql 批量插入 批量更新
查看>>
ItelliJ IDEA开发工具使用—创建一个web项目
查看>>
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>
淘宝API-类目
查看>>