插入排序->希尔排序


/**
 * 插入排序
 */
public class InsertSort {
    public static void main(String[] args){
        int[] arr = {5,5,2,6,3,4};
        int length = arr.length;
        int a,b,key;
        for (a = 1; a < length; a++) {
            key = arr[a];
            b = a - 1; //1
            while (b>=0&&arr[b]>key){
                arr[b+1] = arr[b];
                b--;
            }
            //while不执行arr[b+1]->arr[a]
            arr[b+1] = key;
            System.out.println();
            for (Integer integer : arr) {
                System.out.print(integer+" ");
            }
        }
        //5 5 2 6 3 4
        //2 5 5 6 3 4
        //2 5 5 6 3 4
        //2 3 5 5 6 4
        //2 3 4 5 5 6
    }
}

/**
 * 希尔排序
 */
public class ShellSort1 {
    public static void main(String[] args) {
        int[] arr = {5, 5, 2, 6, 3, 4};
        for (Integer integer : arr) {
            System.out.print(integer+" ");
        }
        int h = 1;
        while (h <= arr.length / 3) {
            h = h * 3 + 1;
        }
        System.out.println();
        System.out.println("h:"+h);
        while (h > 0) {
            for (int a = h; a < arr.length; a++) {
                if (arr[a] < arr[a - h]) {
                    int tmp = arr[a];
                    int b = a - h;
                    while (b >= 0 && arr[b] > tmp) {
                        arr[b + h] = arr[b];
                        b -= h;
                    }
                    arr[b + h] = tmp;
                    System.out.println();
                    for (Integer integer : arr) {
                        System.out.print(integer+" ");
                    }
                }
            }
            h = (h - 1) / 3;
            System.out.println();
            System.out.println("h:"+h);
        }
        //5 5 2 6 3 4
        //h:4
        //
        //3 5 2 6 5 4
        //3 4 2 6 5 5
        //h:1
        //
        //2 3 4 6 5 5
        //2 3 4 5 6 5
        //2 3 4 5 5 6
        //h:0
    }
}

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 希尔排序 并行
 */
public class ShellSort{
    static int[] arr = {5,5,2,6,3,4};
    static ExecutorService pool = Executors.newCachedThreadPool();
    public static class ShellSortTask implements Runnable {
        int i = 0, h = 0;
        CountDownLatch l;
        public ShellSortTask(int i, int h, CountDownLatch l) {
            this.i = i;
            this.h = h;
            this.l = l;
        }

        @Override
        public void run() {
            if (arr[i]<arr[i -h]){
                int tmp = arr[i];
                int b = i - h;
                while (b>=0 && arr[b]>tmp){
                    arr[b+h] = arr[b];
                    b -= h;
                }
                arr[b+h] = tmp;
                System.out.println();
                for (Integer integer : arr) {
                    System.out.print(integer+" ");
                }
            }
            l.countDown();
        }
    }
    public static void pShellSort() throws InterruptedException{
        int h = 1;
        CountDownLatch latch = null;
        while (h<=arr.length/3){
            h = h * 3 + 1;
        }
        while (h>0){
            System.out.println("h:"+h);
            if (h>=4){
                latch = new CountDownLatch(arr.length-h);
            }
            for (int a = h; a < arr.length; a++) {
                if (h >= 4) {
                    pool.execute(new ShellSortTask(a,h,latch));
                } else {
                    if (arr[a] < arr[a - h]) {
                        int tmp = arr[a];
                        int b = a - h;
                        while (b >= 0 && arr[b] > tmp) {
                            arr[b + h] = arr[b];
                            b -= h;
                        }
                        arr[b + h] = tmp;
                        System.out.println();
                        for (Integer integer : arr) {
                            System.out.print(integer+" ");
                        }
                    }
                }
            }
            latch.await();
            h = (h-1)/3;
        }
        pool.shutdown();
    }
    public static void main(String[] args) throws InterruptedException{
        pShellSort();
    }
    //h:4
    //
    //3 5 2 6 5
    //3 4 2 6 5 5 5 h:1
    //
    //2 3 4 6 5 5
    //2 3 4 5 6 5
    //2 3 4 5 5 6
}

转载于:https://www.cnblogs.com/fly-book/p/11491280.html

【排序】插入类排序—(折半)插入排序、希尔排序 前言 在数据结构和算法中,排序是非常重要的一环,并且排序也是渗透编程的方方面面。 你或许在写一个sql的order by按照某组进行排序,又或者你在刷一道题时候、常常遇到贪心+自定义排序求解的思路题,或者变态的面试官让你手写快排,又或者是app的姓氏升降序列 - - - 然而在实际的排序算法的实现上,方式是众多的,不同算法对不同的特征数据的效率也是不同的,并且不同算法的时间复杂度、空间复杂度也不同... 阅读详情

相关推荐

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4033

谷歌八道面试题--【1】求一个满足要求的数组

正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1)、设计一个函数void generate(int a,int b,int N ,int * Q)计算Q的前几项 (2)、设计测试数据来验证函数程序在各种输入下的正确性。 package Designpattern.

知其然,知其所以然! 3877

图像拼接——ITKMontage

ITKMontage是一个开源的、高性能的图像拼接软件模块。它的核心任务是将多张部分重叠的图像瓦片(Tiles)拼接成一幅完整的大图,专为处理材料显微科学中产生的大规模、高分辨率图像而设计。针对ITKMontage模块中示例进行了修改,解决了没有文件TileConfiguration.txt的情况,以及使用中的一些BUG。ITKMontage可以单独编译,也可以作为ITK的一个模块进行编译,介绍后一种的cmake设置。本文介绍使用ITKMontage模块进行图像拼接的方法。此处省略编译后的库配置。

2301_79131410的博客 100

内部排序->插入排序->希尔排序

文字描述   希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进。   从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点:   (1)如果待排序记录本身就是“正序”时, 其时间复杂度可减少为n。   (2)当待排序记录数很小时,直接插入排序的效率也比较高;   希尔排序正是从这两点分析出发对直接插入排序进行了改进。它的基本思想是:...

weixin_30267697的博客 150

如何跑通SuperPoint+LightGlue的训练代码使用gluefactory进行训练和评估?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1785

爆肝5万字❤️Open3D 点云数据处理基础(Python版)

本文为Open3D 点云数据处理基础教程(Python版),小白也能轻松上手!还等什么呢,学起来!

孙悟空 13万+

(shell )希尔排序

//希尔排序 //时间复杂度 O(N^1.3—N^2) //空间复杂度 O(1) public static void shell(int[] array) { int gap = 1; while (gap * 3 + 1 < array.length) { gap = gap * 3 + 1; ...

丑恐龙的博客 159

第77步 时间序列建模实战:多因素预测 vol-2(以决策树回归为例)

第77步 时间序列建模实战:多因素预测 vol-2(以决策树回归为例)

Jet4505的博客 1007

Java 排序之插入排序、希尔排序

本文首发于我的个人博客:https://staunchkai.com 今天学习了一下 Java 数组的相关操作,包含排序和查找,现在先将排序记录巩固一下。 常用并且比较重要的几种排序:插入排序、希尔排序、快速排序、归并排序、冒泡排序、选择排序。 一、插入排序 1. 插入排序算法思想 1) 普遍思想 插入排序的算法是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序的数据,在已排...

STAUNCHKAI 388

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。作为测试环境,本次使用 Registry2 搭建了私有镜像仓库,实际生产环境建议使用 Harbor;创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。

Heartsuit的博客 2461

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构插入排序与希尔排序

1.插入排序 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 1.2.插入排序法思想 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次...

小武的Blog 230

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构——插入排序与希尔排序(python)

直接插入排序 基本思想: 将数组中的待排序元素和前面排好序的元素做比较,如果选择的元素和已排序的元素小,就交换,直到所有的元素都比较过。 此算法需要两层循环: 1、循环遍历待排序的元素; 2、选择的元素A和 已排序 的所有元素比较。 python实现: def insert_sort(alist): """ 插入排序 """ n = len...

qq_42065756的博客 222

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构——插入排序与希尔排序

数据结构——插入排序和希尔排序:干货十足,图文并茂,不容错过的优质好文,欢迎小伙伴们前来学习!!!

麦麦的博客 1904

【C语言】插入排序、希尔排序——动图展示

直接插入时间复杂度是ON2O(N^2)ON2,比如在排逆序数据的时候,但是在有序或接近有序的时间,效率很高,所以希尔排序就对这个缺陷进行了优化,预排序就可以很好解决的这个问题,希尔排序平均复杂度是ON1.3O(N^{1.3})ON1.3。

Eraser的博客 1577

排序——希尔排序、插入排序

本节复习排序中的希尔排序,希尔排序属于插入排序。希尔排序的代码和插入排序非常类似。思想却相对于插入排序来说复杂。在复习希尔排序之前, 我们需要先复习一下插入排序。

strive_mianyang的博客 1389

插入排序——希尔排序

希尔排序的实现,浅谈希尔排序的时间复杂度

m0_73693552的博客 1234

插入排序和希尔排序

今天给小伙伴们分享两个比较基础的排序算法,插入排序和希尔排序

Code_Allen的博客 1318

c语言——插入排序与希尔排序

1.涉及知识点:基本输入输出,分支与循环语句。2.基本思想:将数组分为已排序区间和未排序区间,然后依次从未排序区间取出元素,插入到已排序区间的合适位置。基本思想:将待排序的数组分成若干个较小的子数组,对这些子数组进行插入排序,然后逐步缩小子数组的规模,直至最后整个数组有序。优化方向:希尔排序通过先使数组局部有序,再逐步扩大有序区域的方式,减少了元素的移动次数,从而提高了插入排序的效率。增量序列的选择和插入排序的实现方式对希尔排序的性能有影响,不同的增量序列可能导致不同的排序效果。例如这样的。

qq_34434522的博客 1382

插入排序和希尔排序(详细图解)

希尔排序是插入排序的优化排序,时间复杂度更优。希尔排序:实际是插入排序中加入gap,进行多组并排,使排序速度得到巨大提升。本文先图解直接插入排序,再重点图解希尔排序

好作息,好心态,多锻炼,多学点,多钻研 1926

插入排序与希尔排序

如图所示为常见的排序算法, 前面我们已经了解了堆排序和冒泡排序, 本篇旨在介绍插入排序以及插入排序的优化版本希尔排序.插入排序和希尔排序都是基于比较的排序算法,都属于插入类排序算法。插入排序是一种简单直观的排序算法,其基本思想是将待排序的元素逐个插入到已排序的序列中的合适位置。希尔排序是对插入排序的改进,通过将序列分割成若干子序列来进行排序,最终达到整个序列有序的目的。博客主页:酷酷学!!!插入排序和希尔排序都是比较简单的排序算法,适用于小规模数据的排序。

酷酷学!!!的博客 1426

插入排序,希尔排序

插入排序 插入排序是一种比较排序算法 核心思想 在每次遍历序列过程中,从序列中取出一个元素插入到有序序列中,形成新的有序序列,重复该过程,直到遍历完成,形成新的有序序列。 特点: 时间复杂度分析:O(N^2),如果序列在排序前已经是有序序列,则为O(N) 空间复杂度分析:O(1) 数据量较少时效率高。插入排序适合数据量少的情况 算法的实际运行效率优于选择排序和冒泡排序。 稳定排序 — 插入排序...

kevin的博客 640

一种情况下插入排序比希尔排序要快

        我们都知道希尔排序是插入排序的优化。         希尔排序会在进行插入排序前把数列分组,然后会根据需要把数组内部的数字先进行顺序排列,最终减少插入排序时移动元素的次数,达到优化的目的。         但是我这边简化了部分插入排序的代码,结果在最后测试的时候,插入排序竟然会比希尔排序要快。这里似乎是说希尔排序的代码还能再继续优化?或者还有别的原因?这里我只能把该问题记录了。...

qq_35338695的博客 1437

插入排序之折半插入排序、希尔排序

1.折半插入排序: 折半插入排序实际上是对直接插入排序的优化,通过折半查找来找到要插入的位置,再搬移元素,最后插入即可。 思路分析: 定义low为有序部分的第一个位置,high为有序部分的最后一个位置,通过折半查找的方法,不断更新low和high的位置,直到 low>high,此时high+1即为我们要插入的位置。 直接插入排序是在每一次比较时,就进行数据的搬移;而折半插入排序是在找到插入...

林林酱 636

插入排序和希尔排序比较

今天六六给大家总结简单排序和复杂排序中的插入排序和希尔排序: 插入排序原理: a.把所有的元素分为两组,已经排序的和未排序的; b.找到未排序的组中的第一个元素,向已经排序的组中进行插入; c.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到第一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位。 public class insert { public static void sort(Comparable[] a){ for(int i=1;i&lt

linpengwing的博客 1497
上一篇: 奇偶交换排序
下一篇: 01.java8入门
dffxwe51549
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值