可以先看注释掉的分析,最后在看三层for循环

package com.ebiz.sort;import java.util.Arrays;/*** @author YHj* @create 2019-07-30 8:53* shell排序-交换法*/
public class Shell{public static void main(String[] args) {int [] arr={8,9,1,7,2,3,5,4,6};getResult(arr);// System.out.println(Arrays.toString(arr));//第二次分组 5/2=2 2组,每组两个数的间隔步长为2,//一组5个数,外层循环,一组比较4次,一共8次
//        for (int i = 2; i < arr.length; i++) {
//            //确立要比较的步长的数
//            for (int j = i-2; j >=0 ; j-=2) {
//                if (arr[j]>arr[j+2]){
//                    int temp=arr[j+2];
//                    arr[j+2]=arr[j];
//                    arr[j]=temp;
//                }
//            }
//
//        }
//        System.out.println(Arrays.toString(arr));//第3次分组 2/2=1 1组,,每组两个数的间隔步长为1,//一组10个数,外层循环,一组比较9次,一共9次
//        for (int i = 1; i < arr.length; i++) {
//            //确立要比较的步长的数
//            for (int j = i-1; j >=0 ; j-=1) {
//                if (arr[j]>arr[j+1]){
//                    int temp=arr[j+1];
//                    arr[j+1]=arr[j];
//                    arr[j]=temp;
//                }
//            }
//
//        }
        System.out.println(Arrays.toString(arr));}public static void getResult(int[] arr) {
//        //第一次分组 10/2=5 5组,每组两个数的间隔步长为5,
//        // 一组两个数,外层循环 一组比较1次,一共5次
//        for (int i = 5; i < arr.length; i++) {
//            //确立要比较的步长的数
//            for (int j = i-5; j >=0 ; j-=5) {
//                if (arr[j]>arr[j+5]){
//                    int temp=arr[j+5];
//                    arr[j+5]=arr[j];
//                    arr[j]=temp;
//                }
//            }
//
//        }//控制分的组数for (int i = arr.length/2; i >=1 ; i/=2) {//控制每组比较的次数for (int j = i; j < arr.length; j++) {//每组进行比较并进行交换for (int k= j-i; k >=0 ; k-=i) {if (arr[k]>arr[k+i]){int temp=arr[k+i];arr[k+i]=arr[k];arr[k]=temp;}}}}}}

待完善...

转载于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11299220.html

算法之排序算法-shell排序(交换法)相关推荐

  1. 【八大排序】Shell排序

    目录 前言 一.分组规则 二.代码实现 总结 前言 本文将介绍八大排序之一,Shell排序,Shell排序实际为直接插入排序的优化,使其时间复杂度降低. "shell排序,又名希尔排序,被称 ...

  2. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  3. C--排序算法:shell排序、快速排序

    1.shell排序 Shell排序是这样来分组并排序的:将序列分成子序列,然后分别对子序列进行排序,最后将子序列组合起来.Shell排序将数组元素分成"虚拟"子序列,每个子序列用插 ...

  4. Java常见排序算法之Shell排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  5. 十大经典排序算法之希尔排序及其优化

    一.希尔排序 1.概念 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进. 希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名. 它通过比较相距 ...

  6. 数据结构之内部排序算法总结笔记

    内部排序算法  排序的基本概念: 把一组无序的数据元素按照关键字值递增(或递减)的顺序重新排列.  一.插入排序 思想:将序列分为[有序段]与[无序段]两段,然后依次将[无序段]中的元素插入到[有序段 ...

  7. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  8. 十种常见排序算法欢聚一堂

    文章目录 1.常见排序算法分类 2.非线性时间比较类排序 2.1 交换类排序 2.1.1 冒泡排序 2.1.2 快速排序 2.2 插入类排序 2.2.1 直接插入排序 2.2.2 Shell 排序 2 ...

  9. 【数据结构】排序算法总结

    在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的:若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的.即 ...

  10. 八种常用排序算法参考

    写在前面: 因为网络上有很多篇讲排序算法的,所以这里就不详细讲了,只作为参考和自己查阅 当然了,虽然篇幅也会短很多,但部分重点和要点还在 八种排序算法分别是: ①选择排序: ②冒泡排序: ③插入排序: ...

最新文章

  1. 1.2 Spyder的基本使用
  2. html 密码框自动填充,解决chrom浏览器input密码框自动填充
  3. 关于element-ui 中使用Notice组件(Message、MessageBox、Notification)所遇到的坑
  4. python条形码识别系统_Python识别处理照片中的条形码
  5. 用Silverlight做广告Banner
  6. Ubuntu 16.04修改显示字体大小(包括GNOME/Unity)
  7. 使用ESP32能驱动电子墨水屏吗?
  8. 服务器子系统是什么,服务器是什么样子的,服务器一般用什么系统!
  9. lua软件测试自动化,一种基于Lua脚本的嵌入式软件自动化测试系统及方法专利_专利查询 - 天眼查...
  10. Haybale Guessing (POJ-3657)
  11. [PYTHON] 核心编程笔记(14.Python执行环境)
  12. java内存stack heap_java内存解析-------stack(栈)和heap(堆)的理解
  13. Oracle插入时间
  14. Java招聘数据统计_拉勾网2019年3月20日招聘数据统计
  15. 深入理解C/C++ [Deep C (and C++)] (1)
  16. Cheatsheet: 2013 04.01 ~ 04.16
  17. C# 实体类的get与set
  18. VC2008编译libthrift
  19. android sqlite数据库 emoji表情,Android的Emoji表情
  20. Mac OS使用FFmpeg进行视频H264,H265编码

热门文章

  1. html帮助文档乱码,使用doxygen生成的帮助文档,中文出现乱码的问题
  2. 通过Blender将PMX模型转为FBX导入Unity
  3. C++ 高级篇(一)—— 模板(Templates)
  4. VC命令行编译参数介绍
  5. VC6.0 控件Radio Button的使用
  6. C#和C++结构体Socket通信
  7. 更改文件和目录(及子目录)的拥有者
  8. shell脚本常用语句用法笔记
  9. [react] 举例说明useState
  10. 前端学习(3287):Aop2