个人觉得移位法就是借希尔排序进行分组,插入排序进行排序

注释是上一篇的交换法.

而且这种移位排序的真的很快

package com.ebiz.sort;import java.text.SimpleDateFormat;
import java.util.Date;/*** @author YHj* @create 2019-07-30 8:53* shell排序-交换法*/
public class Shell{public static void main(String[] args) {int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random() * 800000);}String s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("排序前 = " + s);getResult(arr);String l = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("排序后 = " + l);//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;
//                    }
//                }
//
//            }
//
//
//        }//shell排序-移位法,即插入排序//控制分组for (int gap = arr.length/2; gap >0 ; gap/=2) {//所有组进行排序for (int i=gap; i<arr.length;i++){//待排序的数int j=i;int temp=arr[j];//进行比较while (j-gap >= 0 && temp <arr[j-gap]){arr[j]=arr[j-gap];j-=gap;}arr[j]=temp;}}}}

转载于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11313073.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. java 算法 排序算法_Java七种排序算法以及实现

    Java常见七种排序算法以及实现 最近学习一些排序算法,怕自己以后忘记就打算整理起来供自己复习 萌新一枚学习Java没多久,以下仅供参考.如有错误希望大佬指正,欢迎大家在评论区交流探讨. 1.冒泡排序 ...

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

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

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

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

  8. 深圳大学算法实验一——排序算法性能分析

    深圳大学算法实验一 一.实验目的与要求 1. 掌握九种排序算法原理 2. 掌握不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性. 3. 对多种排序算法提出改进方案 4. 综合比较各种 ...

  9. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

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

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

最新文章

  1. numpy 数组 保留小数点后两位小数
  2. Android中文输入的新选择——搜狗拼音输入法
  3. 马斯克再发声,称人工智能是人类文明面临的最大风险
  4. 【机器视觉】 comment算子
  5. 北美暴风雨,Linux5.12被延迟6天发布
  6. LinkedList 方法知识点
  7. Linux 环境下安装 GitLab 与配置
  8. static关键字_一题搞定static关键字
  9. Jquery之AJAX用户注册表单验证(Vancl版)
  10. html背景透明图片不透明,html - css实现背景透明内容不透明。
  11. Python操作Excel制作可视化数据图,实现自动化办公
  12. SharePoint下载服务器资源
  13. 剖析虚幻渲染体系(15)- XR专题
  14. 【Nginx服务优化与防盗链】
  15. 秘密:从程序员到领导者的微妙之处
  16. 2012年度最佳分享:仿webQQ界面,详情请下载,不吃亏
  17. 计算机校本培训心得,校本培训心得体会(通用3篇)
  18. 史上最恐怖的10篇超短篇鬼故事(转…
  19. 高速数字电路AC耦合电容HFSS仿真
  20. 职员信息管理系统php,员工信息管理系统(含附源代码).doc

热门文章

  1. 最全的jquery datatables api 使用详解
  2. Linux下静态IP地址的设置及TFTP服务的搭建
  3. 如何查看服务器当前的负载信息
  4. Ubuntu出现没有正确安装GNOME电源管理器的默认配置
  5. [react] 请描述下事件在react中的处理方式是什么?
  6. 前端小知识点(8):作者为什么设计原型
  7. 前端学习(3193):react的容器中的错误
  8. 前端学习(3014):vue+element今日头条管理--自定义验证
  9. PS教程第十三课:是时候开始战斗了
  10. [html] 说说你对属性data-的理解