排序算法:Java实现希尔排序
希尔排序的思路是先分组再整合
先对下标进行分组,比如当数组长度为20时,一开始选定一个间隔值为10
对数组进行排序,每隔10个元素比较大小并交换,以下标为间隔,1和11比较、2和12比较......10和20比较
然后间隔值减半,从10到5,(1,6,11,16)比较、(2,7,12,17)比较.....(5,10,15,20)比较
间隔值逐步减半,再从5到2,从2到1,间隔值为1时也就是整个数组的元素进行排序
因为一开始分组交换时,没有顾及到不同组之间元素的前后关系,所以这是一个不稳定的排序算法
代码示例
- 1 public class ShellSortDemo {
- 2 public static void main(String[] args) {
- 3
- 4
- 5
- 6 int[] arr = new int[20];
- 7 int[] arr1 = new int[arr.length];
- 8 for (int i = 0; i < arr.length; i++) {
- 9 arr[i] = new Random().nextInt() % 1000;
- 10 arr1[i] = arr[i];
- 11 }
- 12 System.out.println(Arrays.toString(arr));
- 13 shellSort(arr);
- 14 sort(arr1);
- 15 System.out.println(Arrays.toString(arr));
- 16 }
- 17
- 18 public static void shellSort(int[] arr){
- 19
- 20 /**
- 21 * 虽然嵌套了三个循环,但是数据的交换次数并不多
- 22 */
- 23 int second = 0;
- 24 for (int gap = arr.length/2; gap >= 1 ; gap/=2) {
- 25 for (int i = gap; i < arr.length; i++) {
- 26 int j = i;
- 27 //分组后,每一组先排序前面的,再排序后面的
- 28 while (j-gap >= 0 && arr[j] < arr[j-gap]){
- 29 second++;
- 30 swap(arr,j,j-gap);
- 31 j -= gap;
- 32 }
- 33 }
- 34 }
- 35 System.out.println("希尔排序交换次数:"+second);
- 36 }
- 37
- 38 /**
- 39 * 基本的冒泡排序
- 40 */
- 41 public static void sort(int[] arr){
- 42 int second = 0;
- 43 for (int i = 0; i < arr.length - 1; i++) {
- 44 for (int j = 0; j < arr.length -1; j++) {
- 45 if(arr[j] > arr[j+1]){
- 46 swap(arr,j,j+1);
- 47 second++;
- 48 }
- 49 }
- 50 }
- 51 System.out.println("冒泡排序交换次数:"+second);
- 52
- 53 }
- 54 public static void swap(int[] arr,int a,int b){
- 55 int tmp = arr[a];
- 56 arr[a] = arr[b];
- 57 arr[b] = tmp;
- 58 }
- 59 }
希尔排序代码主要是三个循环和一个判断,虽然写了三个循环,但是比较了一下,数据交换次数比冒泡排序少了很多。
排序算法:Java实现希尔排序的更多相关文章
- 排序算法入门之希尔排序(java实现)
希尔排序是对插入排序的改进.插入排序是前面元素已经有序了,移动元素是一个一个一次往后移动,当插入的元素比前面排好序的所有元素都小时,则需要将前面所有元素都往后移动.希尔排序有了自己的增量,可以理解为插 ...
- 八大排序算法之二希尔排序(Shell Sort)
希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...
- 排序算法Java代码实现(三)—— 插入排序 和 希尔排序
因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序 ...
- 八大排序算法 JAVA实现 亲自测试 可用!
今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...
- 八大排序算法Java
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
- 6种基础排序算法java源码+图文解析[面试宝典]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...
- 十大基础排序算法[java源码+动静双图解析+性能分析]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...
- python算法介绍:希尔排序
python作为一种新的语言,在很多功能自然要比Java要好一些,也容易让人接受,而且不管您是成年人还是少儿都可以学习这个语言,今天就为大家来分享一个python算法教程之希尔排序,现在我们就来看看吧 ...
- Java常见排序算法之直接选择排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- Java实现希尔排序(增量递减排序)
package Insert.sort; import java.util.Scanner; /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 * ...
随机推荐
- [第十五篇]——Swarm 集群管理之Spring Cloud直播商城 b2b2c电子商务技术总结
Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机. Docker Swarm 提供了标准的 Dock ...
- PTA面向对象程序设计6-3 面积计算器(函数重载)
实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int z); 第一个函数计算长方形的 ...
- 第一次用AngularJS
1.创建指令的4种方式(ECMA) var appModule = angular.module('app', []); appModule.directive('hello', function() ...
- 【C++基础教程】第二课
一,上次的课后练习答案 1,输出1+2=3 2,输出2 2.25 2.25 2.25 3,第一空iostream或bits/stdc++.h 第二空main(),main(void)或main(int ...
- 使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径
使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径 通过metaweblog API 发布博文的时候,由于markdown中的图片路径是本地路径,将导致发布的文章图片不 ...
- mac的vssh用sftp连不上,报unexpected SSH2_MSG_UNIMPLEMENTED packet
- Jmeter系列(35)- 设置JVM内存
场景 单台机器的下JMeter启动较大线程数时可能会出现运行报错的情况,或者在运行一段时间后,JMeter每秒生成的请求数会逐步下降,直到为0,即JMeter运行变得很"卡",这时 ...
- Shell系列(24)- 条件判断之文件类型
按照文件类型进行判断 标红,记住:其他了解即可 测试选项 作用 -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符 ...
- oracle 基础SQL语句 增删改
一.SQL操作 查询已创建的数据库:SELECT datname FROM pg_database; 创建数据库:CREATE DATABASE wzxdb; 删除数据库:DROP DATABASE ...
- CF666E-Forensic Examination【广义SAM,线段树合并】
正题 题目链接:https://www.luogu.com.cn/problem/CF666E 解题思路 给出一个串\(S\)和\(n\)个串\(T_i\).\(m\)次询问\(S_{a\sim b} ...