希尔排序

插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
    基本思想
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量为1(选择增量d1=len/2,d2=d1/2...最后增量为1),即所有记录放在同一组中进行直接插入排序为止。
 
功能要求:输入数组;输出每步骤的步长和排序情况;希望能进行排序方向的选择(从大到小或从小到大)
 
源代码:
import java.util.Scanner;

public class XierPaixu {

    public static void main(String[] args) {
/**
* 键盘输入数组
*/
int[] a = null;
System.out.println("请输入数组长度:");
Scanner sc = new Scanner(System.in);
int len = 0;
try {
len = Integer.parseInt(sc.nextLine());
} catch (Exception e) {
}
a = new int[len];
System.out.println("请输入数组:");
for(int i=0;i<a.length;i++) {
a[i]=sc.nextInt();
}
System.out.println("原数组为:");
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
/**
* 选择升序或降序
*/
System.out.println(" ");
System.out.println("升序请按1;降序请按2");
Scanner s = new Scanner(System.in);
int b = 0;
try {
b = Integer.parseInt(s.nextLine());
} catch (Exception e) {
}
switch (b){
case 1:
xierAsc(a);
break;
case 2:
xierDesc(a);
break;
case 0:
System.out.println("请选择1或2!");
break;
} } public static void xierAsc(int arr[]) {
/**
* 希尔排序---升序
*/
int len= arr.length;
for(int d=len/2; d>=1; d=d/2){//选择增量d1=len/2,d2=d1/2...最后增量为1
for(int i=d; i<len; i++){ //从第d+1个元素,逐个对其所在组进行直接插入排序操作
for(int j=i-d; j>=0; j=j-d){
if(arr[j] > arr[j + d]) {//符合条件交换位置
swap(arr,j,j+d);//j+d 代表即将插入的元素所在的角标
}
}
}
System.out.println("增量为"+d+"时的排序结果:");
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println(" ");
}
}
public static void swap(int[] arr, int a, int b) { //交换
int t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
public static void xierDesc(int arr[]) {
/**
* 希尔排序---降序
*/
int len= arr.length;
if(arr == null || arr.length == 0) { //判断数组是否为空
System.out.println("该数组为空!");
return;
}
for(int d=len/2; d>0; d=d/2){//选择增量d1=len/2,d2=d1/2...最后增量为1
for(int i=d; i<len; i++){//从第d+1个元素,逐个对其所在组进行直接插入排序操作
for(int j=i-d; j>=0; j=j-d){
if(arr[j] < arr[j + d]) {//符合条件交换位置
swap(arr,j,j+d);//j+d 代表即将插入的元素所在的角标
}
}
}
System.out.println("增量为"+d+"时的排序结果:");
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println(" ");
}
} }

运行截图:

排序---希尔排序Java的更多相关文章

  1. C语言实现 冒泡排序 选择排序 希尔排序

    // 冒泡排序 // 选择排序 // 希尔排序 // 快速排序 // 递归排序 // 堆排序 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h& ...

  2. Java数据结构之排序---希尔排序

    希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...

  3. 排序 —— 希尔排序(Shell sort)

    希尔排序(Shell sort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障(冒泡和插入排序,基于相邻元素的交换)的第一批算法.希尔排序改进了冒泡和插入排序的相邻元素才进行 ...

  4. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  5. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...

  6. 希尔排序和归并排序(java实现)

    希尔排序 希尔排序算法实际上是一种特殊的插入排序,由DL.Shell于1959年提出而得名. 算法思想:希尔排序使数组中任意间隔为h的元素都是有序的,这些数组称为h有序数组,对于每个h,按插入排序进行 ...

  7. 常见的排序算法之Java代码解释

    一 简要介绍 一般排序均值的是将一个已经无序的序列数据重新排列成有序的 常见的排序分为: 1 插入类排序 主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排 ...

  8. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  9. Java排序之排序大综合

    一.最近写了一些排序,于是和和大家分享一下:(默认都是从小到大排序) 二.冒泡排序 1.什么是冒泡排序:原理是临近的两个数比较大小,将较大的数往后移,这样遍历一趟数组以后,最大的数就排在的最后面(时间 ...

随机推荐

  1. Go内存分配器可视化指南【译】【精】

    当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂.一切看起来都像一个神秘的黑盒子.因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥 ...

  2. 2019 搜狐java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.搜狐等公司offer,岗位是Java后端开发,因为发展原因最终选择去了搜狐,入职一年时间了,也成为了面试官,之 ...

  3. 2019 字节跳动java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.字节跳动等公司offer,岗位是Java后端开发,因为发展原因最终选择去了字节跳动,入职一年时间了,也成为了面 ...

  4. aria2 adduri

    demo, ok import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handl ...

  5. v8--sort 方法 源码 (2) 快速排序法

    v8 sort方法部分关于快速排序法的源码: function QuickSort(a, from, to) { // Insertion sort is faster for short array ...

  6. testNG 注释实例

    1. 单个测试用例文件 新建TestDBConnection.java文件 import org.testng.annotations.*; public class TestDBConnection ...

  7. 理解 Cookie,Session,Token 并结合 Redis 的使用

    Http 协议是一个无状态协议, 客户端每次发出请求, 请求之间是没有任何关系的.但是当多个浏览器同时访问同一服务时,服务器怎么区分来访者哪个是哪个呢? cookie.session.token 就是 ...

  8. 图记 2016.1.7 获取本地图片、Bitmap转image

    这几天完成的内容有: 1.“添加图片”按钮 2.添加图片功能 遇到的问题: 我想要将添加图片按钮放在右下角,所以采用了相对布局,但是问题随之二来,因为将导航栏设置成了半透明,所以图片放到右下角之后,半 ...

  9. MySQL/MariaDB数据库的视图(VIEW)

     MySQL/MariaDB数据库的视图(VIEW) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.视图概述 1>.什么是视图 视图就是一个虚拟的表,保存有实表的查询结果 ...

  10. 使用Cloudera Manager部署Kafka消息队列

    使用Cloudera Manager部署Kafka消息队列 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.下载需要安装的Kafka版本 1>.查看Cloudera Dis ...