Java ShellSort

/**
* <html>
* <body>
* <P> Copyright 1994-2018 JasonInternational </p>
* <p> All rights reserved.</p>
* <p> Created on 2018年4月10日 </p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.algorithm.sorts; import java.util.ArrayList;
import java.util.List; /**
* Shellsort, also known as Shell sort or Shell's method, is an in-place
* comparison sort. It generalizes an exchanging sort, such as insertion or
* bubble sort, by starting the comparison and exchange of elements with
* elements that are far apart before finishing with neighboring elements.
* Starting with far apart elements can move some out-of-place elements into
* position faster than a simple nearest neighbor exchange.
* <p>
* Family: Exchanging.<br>
* Space: In-place.<br>
* Stable: False.<br>
* <p>
* Average case = depends on the gap<br>
* Worst case = O(n * log^2 n)<br>
* Best case = O(n)<br>
* <p>
* @see <a href="https://en.wikipedia.org/wiki/Shell_sort">Shell Sort (Wikipedia)</a>
* <br>
* @author Justin Wetherell <phishman3579@gmail.com>
*/
public class ShellSort<T extends Comparable<T>> { private ShellSort() { } public static <T extends Comparable<T>> T[] sort(int[] shells, T[] unsorted) {
for (int gap : shells) {
// Allocate arrays
List<List<T>> subarrays = new ArrayList<List<T>>(gap);
for (int i = 0; i < gap; i++) {
subarrays.add(new ArrayList<T>(10));
}
// Populate sub-arrays
int i = 0;
int length = unsorted.length;
while (i < length) {
for (int j = 0; j < gap; j++) {
if (i >= length)
continue;
T v = unsorted[i++];
List<T> list = subarrays.get(j);
list.add(v);
}
}
// Sort all sub-arrays
sortSubarrays(subarrays);
// Push the sub-arrays into the int array
int k = 0;
int iter = 0;
while (k < length) {
for (int j = 0; j < gap; j++) {
if (k >= length)
continue;
unsorted[k++] = subarrays.get(j).get(iter);
}
iter++;
}
}
return unsorted;
} private static <T extends Comparable<T>> void sortSubarrays(List<List<T>> lists) {
for (List<T> list : lists) {
sort(list);
}
} /**
* Insertion sort
*
* @param list
* List to be sorted.
*/
private static <T extends Comparable<T>> void sort(List<T> list) {
int size = list.size();
for (int i = 1; i < size; i++) {
for (int j = i; j > 0; j--) {
T a = list.get(j);
T b = list.get(j - 1);
if (a.compareTo(b) < 0) {
list.set(j - 1, a);
list.set(j, b);
} else {
break;
}
}
}
}
}

  

Java ShellSort的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. Java基础知识强化57:经典排序之希尔排序(ShellSort)

    1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...

  3. 希尔排序(java)

    时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...

  4. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  5. 8个排序算法——java

    public static void radixsort(int[] a){ int max=a[0]; for(int i=1;i<a.length;i++){ if (max<a[i] ...

  6. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  7. Java各种排序算法详解

    排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插 ...

  8. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

  9. Java程序员必须掌握的8大排序算法

    分类: 1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序) 所需辅助空间最多:归并排序所需辅助空间最少:堆 ...

随机推荐

  1. 个微信小程序云开发云函数

    1. project.config.json写上云函数所在目录"cloudfunctionRoot": "cloudfunctions/",如图 2. app. ...

  2. Nginx配置信息损毁又无备份时如何恢复

    worker_processes *; 本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息. 问题背景 假设 /etc/nginx/site-av ...

  3. ES--Kibana相关操作创建索引和Mapping

    创建索引 kibana 使用如下命令进行创建索引内容. PUT test_index/ 创建别名 POST _aliases { "actions": [{ "add&q ...

  4. phpstorm设置最多标签数

    在settings=>Editor=>General=>Editor Tabs的Tab limit下可以设置当前窗口能够打开的最多标签数目,默认是10,超过设定值时,会自动关闭前面的 ...

  5. 阶段5 3.微服务项目【学成在线】_day18 用户授权_02-方法授权-需求分析

    2 方法授权 2.1需求分析 方法授权要完成的是资源服务根据jwt令牌完成对方法的授权,具体流程如下: 1.生成Jwt令牌时在令牌中写入用户所拥有的权限 我们给每个权限起个名字,例如某个用户拥有如下权 ...

  6. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_01-我的课程-需求分析与PageHelper技术

    1 我的课程 1.1需求分析 课程添加完成后可通过我的课程进入课程修改页面,此页面显示我的课程列表,如下图所示,可分页查询. 注意:由于课程图片服务器没有搭建,这里在测试时图片暂时无法显示. 上边的查 ...

  7. Python项目开发之CMDB理解与分析

    CMDB的由来--ITIL ITIL就是IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库),由英国政府部门CC ...

  8. Python命令行参数解析模块getopt使用实例

    Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...

  9. mysql导入、导出 ( 带视图)

    1创建账号授权 grant all privileges on jenkinsddbes.* to 'jenkinsddbes'@'%' identified by '1iN@Da12tA&* ...

  10. pcntl_waitpid函数解释

    pcntl_waitpid 等待或返回fork的子进程状态.多进程的主进程创建了子进程,那主进程如何确认子进程的状态呢. 假如主进程需要根据子进程的状态做不同的处理呢, 这里的状态包括子进程被kill ...