Java ShellSort

  1. /**
  2. * <html>
  3. * <body>
  4. * <P> Copyright 1994-2018 JasonInternational </p>
  5. * <p> All rights reserved.</p>
  6. * <p> Created on 2018年4月10日 </p>
  7. * <p> Created by Jason</p>
  8. * </body>
  9. * </html>
  10. */
  11. package cn.ucaner.algorithm.sorts;
  12.  
  13. import java.util.ArrayList;
  14. import java.util.List;
  15.  
  16. /**
  17. * Shellsort, also known as Shell sort or Shell's method, is an in-place
  18. * comparison sort. It generalizes an exchanging sort, such as insertion or
  19. * bubble sort, by starting the comparison and exchange of elements with
  20. * elements that are far apart before finishing with neighboring elements.
  21. * Starting with far apart elements can move some out-of-place elements into
  22. * position faster than a simple nearest neighbor exchange.
  23. * <p>
  24. * Family: Exchanging.<br>
  25. * Space: In-place.<br>
  26. * Stable: False.<br>
  27. * <p>
  28. * Average case = depends on the gap<br>
  29. * Worst case = O(n * log^2 n)<br>
  30. * Best case = O(n)<br>
  31. * <p>
  32. * @see <a href="https://en.wikipedia.org/wiki/Shell_sort">Shell Sort (Wikipedia)</a>
  33. * <br>
  34. * @author Justin Wetherell <phishman3579@gmail.com>
  35. */
  36. public class ShellSort<T extends Comparable<T>> {
  37.  
  38. private ShellSort() { }
  39.  
  40. public static <T extends Comparable<T>> T[] sort(int[] shells, T[] unsorted) {
  41. for (int gap : shells) {
  42. // Allocate arrays
  43. List<List<T>> subarrays = new ArrayList<List<T>>(gap);
  44. for (int i = 0; i < gap; i++) {
  45. subarrays.add(new ArrayList<T>(10));
  46. }
  47. // Populate sub-arrays
  48. int i = 0;
  49. int length = unsorted.length;
  50. while (i < length) {
  51. for (int j = 0; j < gap; j++) {
  52. if (i >= length)
  53. continue;
  54. T v = unsorted[i++];
  55. List<T> list = subarrays.get(j);
  56. list.add(v);
  57. }
  58. }
  59. // Sort all sub-arrays
  60. sortSubarrays(subarrays);
  61. // Push the sub-arrays into the int array
  62. int k = 0;
  63. int iter = 0;
  64. while (k < length) {
  65. for (int j = 0; j < gap; j++) {
  66. if (k >= length)
  67. continue;
  68. unsorted[k++] = subarrays.get(j).get(iter);
  69. }
  70. iter++;
  71. }
  72. }
  73. return unsorted;
  74. }
  75.  
  76. private static <T extends Comparable<T>> void sortSubarrays(List<List<T>> lists) {
  77. for (List<T> list : lists) {
  78. sort(list);
  79. }
  80. }
  81.  
  82. /**
  83. * Insertion sort
  84. *
  85. * @param list
  86. * List to be sorted.
  87. */
  88. private static <T extends Comparable<T>> void sort(List<T> list) {
  89. int size = list.size();
  90. for (int i = 1; i < size; i++) {
  91. for (int j = i; j > 0; j--) {
  92. T a = list.get(j);
  93. T b = list.get(j - 1);
  94. if (a.compareTo(b) < 0) {
  95. list.set(j - 1, a);
  96. list.set(j, b);
  97. } else {
  98. break;
  99. }
  100. }
  101. }
  102. }
  103. }

  

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. Linux 端口被进程多次占用,LINUX最好用查看端口占用并杀死(kill)的方式

    一.端口被占用 二.查看进程 三.并杀死占用端口的进程,并重启服务,状体正常 补充: 根据指定端口查看 wd@wd:~/workspace/cat$ sudo netstat -tlnp|grep 6 ...

  2. Code First 迁移----官方 应用程序启动时自动升级(MigrateDatabaseToLatestVersion 初始值设定项)

    Code First 迁移 如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数 ...

  3. 微信小程序 位置定位position详解,相对定位relative,绝对定位absolute相关问题

    一.位置position[定位属性:static,relative,absolute,fixed,inherit,-ms-page,initial,unset] 1.static:元素框正常生成,块级 ...

  4. php实现excel单元格合并,字体加粗居中等操作

    使用的是phpexcel,基本用的原生语法,所见即所得,直接复制下面代码,即可: // 引用phpexcel类 $this->load->library('PHPExcel'); // 创 ...

  5. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_08-课程预览技术方案

    3.2.1 技术需求 课程详情页面是向用户展示课程信息的窗口,课程相当于网站的商品,本页面的访问量会非常大.此页面的内容设 计不仅要展示出课程核心重要的内容而且用户访问页面的速度要有保证,有统计显示打 ...

  6. LeetCode_169. Majority Element

    169. Majority Element Easy Given an array of size n, find the majority element. The majority element ...

  7. spark实现wordcount

    spark-shell --master yarnsc:val lineRDD=sc.textFile("/test/input/test")lineRDD.collect().f ...

  8. 返回日期格式:2017-12-03T13:58:58.901Z,判断时间间隔 如 “刚刚”,“一分钟前”,“一小时前”等

    后台返回的格式如下: 实现输出如下: 我的处理如下: // 处理数据 2017-11-28T02:41:09.487Z // 请求的时间戳.日期格式按照ISO8601标准表示,并需要使用UTC时间. ...

  9. 【ARTS】01_32_左耳听风-201900617~201900623

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  10. Spring mvc +ajax 发送邮件

    1.前端页面--form表单提交,通过发送按钮的id=“send”定位DOM,触发ajax请求 <form class="form-horizontal" id=" ...