Java ShellSort
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的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...
- 希尔排序(java)
时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 8个排序算法——java
public static void radixsort(int[] a){ int max=a[0]; for(int i=1;i<a.length;i++){ if (max<a[i] ...
- 八大排序算法Java
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
- Java各种排序算法详解
排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插 ...
- 希尔排序及希尔排序java代码
原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...
- Java程序员必须掌握的8大排序算法
分类: 1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序) 所需辅助空间最多:归并排序所需辅助空间最少:堆 ...
随机推荐
- C#Winform ListView中没有Item双击事件的两种实现方法!
第一种: //if (this.listView1.FocusedItem != null) //{ // if (this.listView1.SelectedItems != null) // { ...
- Java并发包异步执行器CompletableFuture
前言 CompletableFuture是对Future的一种强有力的扩展,Future只能通过轮询isDone()方法或者调用get()阻塞等待获取一个异步任务的结果,才能继续执行下一步,当我们执行 ...
- 关于Mysql中GROUP_CONCAT函数返回值长度的坑
1.GROUP_CONCAT函数: 功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果. 语法:group_concat( [distinct] 要连接的字段 [order b ...
- SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
转自:https://blog.csdn.net/zhongguomao/article/details/53515203 去年SAP推出了新一代商务套件SAP S/4 HANA,无疑是ERP行业创新 ...
- c# 调用mysql数据库验证用户名和密码
使用mysql数据库验证用户名和密码时,如果用户名是中文,一直查不到数据 需要把app.config 中修改为 数据库统一设置utf8编码格式,连接数据库的时候设置编码Charset=utf8可以避免 ...
- SMOS数据产品介绍与下载方法
1. SMOS数据介绍 The Soil Moisture and Ocean Salinity (SMOS) 卫星是欧空局发射的一颗以探测地球土壤水含量以及海表盐度为目标的卫星,卫星所搭载的唯一载荷 ...
- excel自学笔记 from av50264533
1.函数公式 MINUTE(serial_number) 函数解读 Serial_number 表示一个时间值,其中包含要查找的分钟 函数公式 NOW() 函数解读 显示出现在的时间 计算通话时 ...
- golang web框架 beego 学习 (六) request body和module的映射
router.go package routers import ( "gowebProject/controllers" "github.com/astaxie/bee ...
- 高级UI-Snackbar
在与用户的交互中,最为常用的Toast和Dialog,但二者都存在其局限,Toast无法与用户进行交互,Dialog虽然可以与用户交互,但却会阻断用户操作的连贯性,介于二者之间的平衡,Snackbar ...
- netcore mvc菜单,角色,权限
netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源 AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建 ...