java方式实现希尔排序
一、希尔排序简述和基本思想
希尔排序也称递减增量排序算法,是插入排序的一种更高效的改进版本。但是希尔排序是非稳定排序的算法。希尔排序比一般插入排序有以下几点改进:
- 一般插入排序每次只能将数据移动一位,而希尔排序是按照步长移动的(步长=数组长度/2),步长是递减的。
- 希尔排序是通过多次划分子序列,对子序列进行排序,使得整个序列基本有序,再对整个序列的所有元素进行直接插入排序,提高了最后直接插入排序的效率。
希尔排序的基本思想是:先将整个待排序的序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行依次进行直接插入排序。希尔排序是不稳定排序,希尔排序平均时间复杂度为O(n1.3),最差时间复杂度为O(n2),空间复杂度为O(1)。
二、基本步骤
- 将整个序列分成n/2个子序列,即是第k个数跟n/2+k(k<=n/2)个数为一个子序列。
- 将分好的子序列用插入排序的方式将各个子序列排好序。
- 将整个序列分成n/4个子序列,然后分好的子序列按照插入排序排好序。
- 不断执行以上操作,直到子序列数为1,排序完成。
三、案例分析
以序列 1,5,4,30,6,29,5,20为例
第一趟排序:子序列数=n/2=4 四个子序列为{1,6},{5,29},{4,5},{30,20}将这四个序列排序后为{1,5,4,20,6,29,5,30}。
第二趟排序:子序列数=n/4=2 二个子序列为{1,4,6,5},{5,20,29,30}将这二个序列排序后为{1,5,4,20,5,29,6,30}。
第二趟排序:子序列数=n/8=1 一个子序列为{1,4,6,5 ,5,20,29,30}将这一个序列排序后为{1,4,5,5,6,20,29,30}。
四、代码展示
public class JavaSort {
public static void main(String[] args) {
int a [] =new int []{1,5,4,30,6,29,5,20};
System.out.println("排序前的数组:"+Arrays.toString(a));
shellSort(a);
System.out.println("排序后的数组:"+Arrays.toString(a));
}
/**
*
* @param ary要排序的数组
* @return 返回排序好的数组
*/
public static int [] shellSort(int [] ary) {
int len=ary.length;
for (int num= len/2; num>=1; num=num/2) {//num为子序列数,num也表示子序列元素在原来序列中相差的位置
//找到子序列,子序列用插入排序进行排序
for (int i = num; i < len; i++) {
int j=i-num;//子序列元素要插入的位置
int temp=ary[i];//子序列要插入的元素值暂存
while(j>0&&temp<ary[j]) {//将要插入元素子序列元素比较找到要插入元素的位置
ary[j+num]=ary[j];
j=j-num;
}
ary[j+num]=temp;//插入要插入的子序列元素
}
}
return ary;
}
}
运行结果:

java方式实现希尔排序的更多相关文章
- 几种排序方式的java实现(02:希尔排序,归并排序,堆排序)
代码(部分为别人代码): 1.希尔排序(ShellSort) /* * 希尔排序:先取一个小于n的整数d1作为第一个增量, * 把文件的全部记录分成(n除以d1)个组.所有距离为d1的倍数的记录放在同 ...
- 算法-java代码实现希尔排序
希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2 ...
- 常用算法Java实现之希尔排序
希尔排序严格来说是基于插入排序的思想,又被称为缩小增量排序. 具体流程如下: 1.将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对... 2.对每对数据进行比较和交换, ...
- 排序算法Java实现(希尔排序)
算法描述:先将待排序序列的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序. packa ...
- java方式实现选择排序
一.基本思想 每一趟找到未排序序列的最小(大)值,把它存放在已排序序列末尾,直到把所有的数据排序完,即是第k趟找到剩余未排序数据的最小(大)值,然后把这个最小(大)值存放在数组的第k(k=1,2... ...
- java希尔排序
java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...
- java排序算法之希尔排序
希尔排序是冲破二次时间屏障的第一批算法之一. 它是通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到最后一趟(比较相邻元素)为止.因此希尔排序也叫缩减增量排序. 希尔排序使 ...
- 希尔排序java
希尔排序简述 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率.(希尔排序先将部分数据进行排序,相当于已经部分排好序) ...
- 希尔排序----java实现
思路:希尔排序是分组基础上的直接插入排序,给定的一个步长数组,每个小组先直接插入排序.虽然有四次循环,但是每次循环次数少. package com.sheepmu.text; import java. ...
随机推荐
- andorid jar/库源码解析之Dagger/Dagger2
目录:andorid jar/库源码解析 Dagger.Dagger2: 作用: 1.用于解耦Activity和业务逻辑 2.在使用业务的时候,不需要重复编写new代码. 3.当业务变化的时候,不需要 ...
- Redis 6.0 新特性-多线程连环13问!
Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...
- 数据预处理 —— padding数据
1. 论Conv2d()里的padding和Conv2d()前padding的区别及重要性. 小生建议,尽量少用Conv2d()里的填充方式,换成自定义填充方式(强烈建议). 小生为何这样建议 ...
- Mybatis使用ResultMap
解决字段名和属性名不一致的问题 - 新建数据库表的字段-这里就不贴上了 在下面链接有 https://www.cnblogs.com/rzkwz/p/12853899.html 设置实体类和数据库字段 ...
- 【MySQL基础总结】索引的使用
索引的使用 概述 1.索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度 2.索引的优点是可以提高检索数据的速度 3.缺点是创建和维护索引需要耗费时间 4.所以索引可以提高查询速度,减 ...
- c++(qt)程序员微信群
关注微信公众号"程序员成长日志",回复关键字"c++"扫码进群 本群主要为大家解决工作中遇到的问题遇到的问题发到群里大家集思广益平时可以瞎扯不定期红包
- python循环中对一个列表的赋值问题
参考:https://www.cnblogs.com/zf-blog/p/10613981.html https://www.cnblogs.com/andywenzhi/p/7453374.html ...
- HDU 2006 (水)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2006 题目大意:给你几个数,求奇数的乘积和 解题思路: 很水,不需要数组的,一个变量 x 就行 代码: ...
- CSS理论:margin-left在float中的运用
源码如下: margin-left 指的是左边的外边距,为正数时,左边间距增大,div向右偏移,为负数时,左边间距减少,相反往左偏移 双飞翼 .wrap { width: 100%; margin: ...
- PAT 1006 Sign In and Sign Out (25分) 字符串比较
题目 At the beginning of every day, the first person who signs in the computer room will unlock the do ...