package com.atguigu.sort;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;/*** @创建人 wdl* @创建时间 2021/3/22* @描述*/
public class ShellSort {public static void main(String[] args) {//        int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};//创建一个80000个的随机数组int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random() * 8000000);//生成一个[0,8000000)数}Date data1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");String data1str = simpleDateFormat.format(data1);System.out.println("排序前的时间是=" + data1str);shellSort2(arr);Date data2 = new Date();String data2str = simpleDateFormat.format(data2);System.out.println("排序后的时间是=" + data2str);}//使用逐步推导的方式来编写希尔排序public static void shellSort(int[] arr) {//根据前面的逐步分析,使用循环处理int temp = 0;int count = 0;for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {//遍历各组中所有的元素(共5组,每组有2个元素),步长5for (int j = i - gap; j >= 0; j -= gap) {//如果当前元素大于加上步长后的元素,说明需要交换if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}
//            System.out.println("希尔排序"+(++count)+"轮后=" + Arrays.toString(arr));}//
//        int temp = 0;
//        //希尔排序的第1轮排序
//        //因为第一轮排序,是将10个数据分成了5组
//        for (int i = 5; i < arr.length; i++) {//            //遍历各组中所有的元素(共5组,每组有2个元素),步长5
//            for (int j = i - 5; j >= 0; j -= 5) {//                //如果当前元素大于加上步长后的元素,说明需要交换
//                if (arr[j] > arr[j + 5]) {//                    temp = arr[j];
//                    arr[j] = arr[j + 5];
//                    arr[j + 5] = temp;
//                }
//
//
//            }
//        }
//        System.out.println("希尔排序1轮后=" + Arrays.toString(arr));//[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
//
//
//        //希尔排序的第2轮排序
//        //因为第二轮排序,是将10个数据分成了5/2组
//        for (int i = 2; i < arr.length; i++) {//            //遍历各组中所有的元素(共5组,每组有2个元素),步长5
//            for (int j = i - 2; j >= 0; j -= 2) {//                //如果当前元素大于加上步长后的元素,说明需要交换
//                if (arr[j] > arr[j + 2]) {//                    temp = arr[j];
//                    arr[j] = arr[j + 2];
//                    arr[j + 2] = temp;
//                }
//
//
//            }
//        }
//        System.out.println("希尔排序2轮后=" + Arrays.toString(arr));//[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
//
//
//        //希尔排序的第3轮排序
//        //因为第二轮排序,是将10个数据分成了2/2组
//        for (int i = 1; i < arr.length; i++) {//            //遍历各组中所有的元素(共5组,每组有2个元素),步长5
//            for (int j = i - 1; j >= 0; j -= 1) {//                //如果当前元素大于加上步长后的元素,说明需要交换
//                if (arr[j] > arr[j + 1]) {//                    temp = arr[j];
//                    arr[j] = arr[j + 1];
//                    arr[j + 1] = temp;
//                }
//
//
//            }
//        }
//        System.out.println("希尔排序3轮后=" + Arrays.toString(arr));}//对交换式的希尔排序进行优化->移位法public static void shellSort2(int[] arr){//增量gap,并逐步的缩小增量for (int gap = arr.length / 2; gap > 0; gap /= 2) {//从第gap个元素,逐个对其所在的组进行直接插入排序for (int i = gap; i < arr.length; i++) {int j=i;int temp=arr[j];if(arr[j]<arr[j-gap]){while (j-gap>=0&&temp<arr[j-gap]){//移动arr[j]=arr[j-gap];j=j-gap;}//当退出while后,就给temp找到了插入的位置arr[j]=temp;}}}}}

希尔排序+移位法(吊打交换法)相关推荐

  1. 十六、希尔排序即其优化(交换法--->移动法)

    一.为何要引入希尔排序 首先先看直接插入排序所存在的弊端,数组 arr = {2,3,4,5,6,1},如果要插入的数1(最小),这样的过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} ...

  2. 高效排序算法——希尔排序、堆排序、归并排序、快速排序

    如标题,这里讨论的是基于比较的排序算法中最高效的三种算法和希尔排序.堆排序.归并排序.快速排序的平均时间复杂度均为O(NlogN).前面有介绍过O(N2)的三种简单排序算法(见三大简单排序算法--插入 ...

  3. 排序算法-03希尔排序(python实现)

    希尔排序 简述 希尔排序又称之为缩小增量排序,从思维导图(冒泡排序的博客)可以得知,这也是一种插入排序,事实上,它就是直接插入排序的加强优化版本. 过程描述 下面的叙述按照维基百科的例子来解释,有一个 ...

  4. 八大排序算法之希尔排序

    描述 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序 ...

  5. 希尔排序(实现+总结)

    希尔排序的名称来源于它的发明者,该算法是第一批冲破二次时间屏障的算法之一,它是基于插入排序改进而成的的一种快速的算法. 1.基本思想:   它的工作原理是比较相隔一定距离的元素,并且每趟比较所用的距离 ...

  6. 算法之排序算法-shell排序(移位法)

    个人觉得移位法就是借希尔排序进行分组,插入排序进行排序 注释是上一篇的交换法. 而且这种移位排序的真的很快 package com.ebiz.sort;import java.text.SimpleD ...

  7. 希尔排序法对一维数组排序

    希尔排序法对一维数组排序 希尔排序(缩小增量排序),首先将整个待排序的序列分割成若干子序列,分别直接插入排序,然后再对全体记录进行插入排序. using System; using System.Co ...

  8. 数据结构排序法之希尔排序法(Shell Sort)

    希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本.希尔排序是不稳定的排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高, ...

  9. 经典算法之希尔排序法(Java实现)

    活动地址:21天学习挑战赛 目录 一.算法 1.算法概述 2.基本思想 3.算法步骤 4.算法特点 二.算法实践 1.Java代码 2.执行结果 三.复杂度分析 1.时间复杂度 2.空间复杂度 一.算 ...

最新文章

  1. HDU1269(强连通分量)
  2. 展望2021年:智能机器人可监督工业机器人干活,效率提升30%
  3. 虚拟机实现二层交换机_局域网SDN技术硬核内幕 5 虚拟化网络的实现
  4. vue 报错 Cannot read property ‘__ob__‘ of undefined的解决方法
  5. 机器学习Sklearn实战——梯度提升树二分类原理
  6. 结构和类中字段的初始化以及用new来操作他们的构造函数
  7. cmake编译mysql常用参数
  8. Eureka Client注册到Eureka Server的秘密
  9. Android桌面组件开发之实时文件夹(Live_Folders)
  10. MySQL新建存储过程出现:ERROR 1558 (HY000): Column count of mysql.proc is wrong. Expected 20, found 16. Create
  11. 基于XML操作辅助类
  12. 尚硅谷vue基础笔记
  13. RC电路延时公式推导
  14. python atan_Python代码中atan()函数有什么功能呢?
  15. 【设计模式】观察者模式
  16. MXL90614红外线测温传感器
  17. JAVA--Socket【“套接字”】
  18. 推荐几本学习Go语言的书
  19. T/CAGIS 1—2019《空间三维模型数据格式》
  20. 上海某马培训软件测试工程师第01期就业班课程

热门文章

  1. revit如何根据坐标进行画线_铭成教你如何根据同步带的齿形进行选型
  2. 顺序表和链表的优缺点理解
  3. 520 钻石争霸赛 7-8浪漫侧影(二叉树的遍历)
  4. P4137 Rmq Problem / mex 主席树求mex
  5. I - Washing clothes
  6. [AtCoder Regular Contest 060] E - Tak and Hotels
  7. 内存管理(ybtoj-二叉堆)
  8. P5369-[PKUSC2018]最大前缀和【状压dp】
  9. P2900-[USACO08MAR]Land AcquisitionG【斜率优化】
  10. jzoj1758-过河【dp】