Shell排序
Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:
1)当数据规模小的时候非常高效
2)当给定数据已经有序时的时间代价为O(N)
所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。
这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。
一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)
package algorithms.sort;
import algorithms.AbstractSort;
public class ShellSort extends AbstractSort {
@Override
public void sort(int[] array) {
int len = array.length;
int value = 1;
while ((value + 1) * 2 < len) {
value = (value + 1) * 2 - 1;
}
for (int delta = value; delta >= 1; delta = (delta + 1) / 2 - 1) {
for (int i = 0; i < delta; i++) {
modifyInsertSort(array, i, len - i, delta);
}
}
}
private void modifyInsertSort(int[] array, int from, int len, int delta) {
if (len <= 1) {
return;
}
int tmp = 0;
for (int i = from + delta; i < from + len; i += delta) {
tmp = array[i];
int j = i;
for (; j > from; j-=delta) {
if (tmp - array[j-delta] < 0) {
array[j] = array[j - delta];
} else {
break;
}
}
array[j] = tmp;
}
}
}
分享到:
相关推荐
冒泡排序,冒泡排序资源,Java排序实现,java实现各种排序算法:冒泡排序、选择排序、插入排序、Shell排序、快速排序、堆排序、合并排序等。
本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...
以上四种排序算法都是基于比较的排序算法,它们适用于各种数据类型的数据排序。插入排序和冒泡排序适合于数据量较小或者数据本身已经较为有序的情况;选择排序虽然简单,但效率较低;而希尔排序通过对插入排序的优化...
本篇将详细介绍标题所提及的四种排序算法:Shell排序、快速排序、归并排序以及堆排序。 1. **Shell排序**: Shell排序是一种改进的插入排序,由Donald Shell于1959年提出。它通过设置一个间隔序列,使得数组中的...
Java作为一种广泛使用的编程语言,提供了多种排序算法的实现。以下是对标题和描述中提到的九种排序算法的详细解释: 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于...
在提供的文件中,我们可以看到几个经典的排序算法的Java实现,包括插入排序(Insertion Sort)、冒泡排序(Bubble Sort)、选择排序(Selection Sort)以及希尔排序(Shell Sort)。以下是对这些算法的详细说明: 1...
在提供的文件中,我们可以看到有四种经典的排序算法的Java实现:插入排序、冒泡排序、选择排序以及希尔排序。 **插入排序**: 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据...
【Java排序算法详细整理】 在计算机科学中,排序算法是用于对一组数据进行排列的算法。在Java中,实现各种排序算法有助于理解数据结构和算法的原理,同时也能提高编程能力。以下是对Java中常见的几种排序算法的详细...
除了以上介绍的四种排序算法外,Java中还有以下几种常用的排序算法: 1. **冒泡排序**:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。遍历所有元素之后,最大的元素就会被放到最后的位置上。然后...
本文将深入探讨在Java中实现的一些常见排序算法,包括冒泡排序、选择排序、Shell排序、快速排序以及归并排序。 1. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换位置...
本文将深入探讨标题"Java排序算法汇总"所涵盖的八大排序算法:起泡排序、堆排序、插入排序、归并排序、快速排序、选择排序、Shell排序以及优化后的归并排序和快速排序。 1. 起泡排序(Bubble Sort): 起泡排序是一...
Java排序算法涉及了多种方法,用于组织数组或集合中的元素,使其按照特定顺序排列。以下是对这些算法的详细解释: 1. **冒泡排序(Bubble Sort)** 冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一...
Java作为广泛应用的编程语言,提供了一种高效的方式来实现各种排序算法。本文将深入探讨Java中实现的两种主要排序类型:插入排序和交换排序。 插入排序是一种简单直观的排序算法,它的工作原理类似于我们日常生活中...
在编程领域,排序算法是数据结构与算法学习中的重要组成部分,尤其在Java中,掌握各种排序算法对于优化程序性能至关重要。下面将详细讲解标题中提到的八种排序算法及其原理和实现。 1. **直接插入排序(直接选择...
Java 中实现排序算法通常涉及到多种方法,每种算法都有其特定的适用场景和性能特点。下面将详细介绍标题和描述中提到的一些常见排序算法,并提供Java实现。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观...
Java排序算法是编程中基础且重要的概念,它们用于组织数组或列表中的元素,使其按照特定顺序排列。在本文中,我们将探讨几种常见的排序算法的Java实现,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、...
### 常用排序算法分析与实现(Java版) #### 插入排序 **1. 直接插入排序** 直接插入排序是一种简单的排序方法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并...
本篇文章将深入探讨两种常见的Java排序算法:Shell排序和快速排序,并介绍一种改进后的快速排序方法。 1. Shell排序: Shell排序,由Donald Shell在1959年提出,是一种基于插入排序的算法,通过将待排序数组分为...
标题《Java排序算法.pdf》意味着本文档涉及的是Java编程语言中实现的多种排序算法。排序算法是一种将元素集合进行组织,以达到有序状态的过程。文档中所列的排序算法包括插入排序(Insert Sort)、冒泡排序(Bubble ...