JAVA数据结构--希尔排序
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n2)的排序(冒泡排序或插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。
package DataStructures;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
Integer nums[]=new Integer[]{45,1,22,15,6,3,7,5,14};
shellsort(nums);
System.out.println("Last is: "+Arrays.toString(nums));
}
public static <AnyType extends Comparable<? super AnyType>>
void shellsort(AnyType[] a){
int j;
for(int gap=a.length/2;gap>0;gap/=2){//确定增量,然后循环处理
for(int i=gap;i<a.length;i++){
AnyType tmp=a[i];
for(j=i;j>=gap&&tmp.compareTo(a[j-gap])<0;j-=gap)//进行插入排序
a[j]=a[j-gap];
a[j]=tmp;
}
System.out.println("GAP="+gap+": "+Arrays.toString(a));
}
}
}
output:
GAP=4: [6, 1, 7, 5, 14, 3, 22, 15, 45]
GAP=2: [6, 1, 7, 3, 14, 5, 22, 15, 45]
GAP=1: [1, 3, 5, 6, 7, 14, 15, 22, 45]
Last is: [1, 3, 5, 6, 7, 14, 15, 22, 45]
当GAP=4时
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 45 | 1 | 22 | 15 | 6 | 3 | 7 | 5 | 14 |
第一趟:分为四组,增量为4,对应下标为 {0,4,8} {1,5} {2,6} {3,7} 然后各组内进行插入排序改变组内元素下标
当GAP=2时
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 6 | 1 | 7 | 5 | 14 | 3 | 22 | 15 | 45 |
第二趟:分为两组,增量为2,对应下标 {0,2,4,6,8} {1,3,5,7},同样进行插入排序
第三趟:同理
JAVA数据结构--希尔排序的更多相关文章
- 数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++)
数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2 ...
- Java数据结构之排序---希尔排序
希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...
- Java实现希尔排序(增量递减排序)
package Insert.sort; import java.util.Scanner; /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 * ...
- Java实现希尔排序
华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作). 看到了这 ...
- Java之希尔排序
希尔排序 前面已经知道了插入排序,明白插入排序的原理,不断比较来交换相邻的元素,这样的话效率不高,为此希尔排序,在插入排序上做出了改进,通过间隔增量来比较并交换元素,这样可以减少比较交换的次数. pa ...
- Java数据结构与排序
一.引子:想要给ArrayList排序却发现没有排序方法?你有两种选择: 1.换用TreeSet: 2.使用Collection.sort(List<T> list) ...
- Java算法-希尔排序
希尔排序的诞生是由于插入排序在处理大规模数组的时候会遇到需要移动太多元素的问题.希尔排序的思想是将一个大的数组“分而治之”,划分为若干个小的数组,以 gap 来划分,比如数组 [1, 2, 3, 4, ...
- [数据结构] 希尔排序 C语言程序
//由小到大 //希尔排序 void shellSort( long int array[], int length) { int i; int j; int k; int gap; //gap是分组 ...
- 算法(第四版)学习笔记之java实现希尔排序
希尔排序思想:使数组中随意间隔为h的元素都是有序的. 希尔排序是插入排序的优化.先对数组局部进行排序,最后再使用插入排序将部分有序的数组排序. 代码例如以下: /** * * @author seab ...
随机推荐
- 【COCI2012】覆盖字符串
[题目描述] 给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2 ...
- 获取文件的后缀名。phpinfo
1: function get_extension($file){ //strrchr 返回 .jpg substr :1 是从1开始. substr(strrchr($file,'.'),1) } ...
- 447. Number of Boomerangs 回力镖数组的数量
[抄题]: Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple ...
- 566. Reshape the Matrix矩阵重排
[抄题]: In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a ...
- 几个常用的HTTP状态码
200:客户端请求成功 302:临时跳转,跳转的地址通过Location指定 400:客户端请求有语法错误,不能被服务器识别 403:服务器收到请求,但是拒绝提供服务 404:请求的资源不存在 500 ...
- c语言打印空白星号矩形
用户输入一个数字N,输出一个N*N的空心矩形,N最小为3 效果如下: 思路是这样的,首先拿到这道题是没有思路的,但我们可以举几个例子,当N等于3的情况,当N=5的情况,发现第一行和最后一行是相同的,而 ...
- 数字图像处理实验(13):PROJECT 05-04,Parametric Wiener Filter 标签: 图像处理MATLAB 2017-05-27 10:59
实验要求: Objective: To understand the high performance of the parametric Wiener Filter in image restora ...
- 10.Python之Ansible自动化运维常用模块
Ansible中文权威文档:http://www.ansible.com.cn/docs/ Ansible从入门到精通:https://www.bilibili.com/video/av3361175 ...
- C# 把本地文件上传到服务器上,和从服务器上下载文件
方法一.通过Ajax方式上传文件(input file),使用FormData进行Ajax请求 <div > <input type="file" name=& ...
- shell 字符串中定位字符位置 获取字符位置
linux shell 字符串操作(长度,查找,替换)详解 该博文中描述的如下两个字符串操作, ${string:position} #在$string中, 从位置$position开始提取子串 ${ ...