基于比较的排序(一)

【算法课程实验一】五种排序算法的分析比较 实验目的:掌握选择排序、冒泡排序、合并排序、快速排序、归并排序的算法原理分析不同排序算法的时间效率和时间复杂度,以及理论值与实测数据的对比分析。一、冒泡排序算法伪代码:for i=1 to n      for j=0 to n-i if ( data[j]>=data[j+1]) swap(data[j],data[j+1]... 阅读详情
前言
不得不先感慨一句,要努力写博客了,好言归正传,最近研究了数据结构,里面有涉及排序,总结总结,
内容

宏观

在这里插入图片描述
算法种类很多,主要介绍用于比较的排序

言归正传,开始介绍

就按照图上的顺序来吧

1.插入类排序–(直接插入,折半插入,希尔排序) 这是插入排序的一个顺序,图有些丑,
在这里插入图片描述

直接插入排序

代码

public class sort {

    public  static void main(String[] args){
    int[] r = {0,2,3,1,5,4,6,8,9,10,7};
    sort sort1= new sort();
    sort1.insertSort(r,0 ,7);

    for (int i : r) {
            System.out.print(i+",");
        }

    }
    public void insertSort(int[] r, int low, int high) {
        // 从小到大
        for (int i = low + 1; i < r.length ; i++) {
            if (r[i] < r[i - 1]) {
                    int temp = r[i];
                r[i] = r[i - 1];
                int j = i - 2;
                for (;j >= low && temp < r[j]; j--) {
                    r[j + 1] = r[j]; // 记录后移
                }
//                while (j > low && temp < r[j]) {
//                    r[j + 1] = r[j];
//                    j--;
//                }
                r[j + 1] = temp;
                // 插入到正确位置
            }
        }
    }
}

代码强调以下问题
1.边界

外层循环:假设为十个数则循环9次
内层循环 从第二个数开始比较

2.时间复杂度

O(n²)

3.原理,

为插入算法,其原理是一种位置移动,而不是相互交换位置,(向有序区中插入值,插入值之后的数依次后移一位)

折半插入算法

代码(没写注释,~~不懂可以问,可以要求加注释)

public class BinaryInsertion {
    public static void main(String[] args) {
        int[] r = {0,2,3,1,9,10,7};
        BinaryInsertion binary = new BinaryInsertion();
        binary.binaryInsertion(r,0,7);
        for (int i : r) {
            System.out.print(i+",");
        }
    }

    public void binaryInsertion(int[] r, int low, int high) {
        for (int i = low + 1; i < r.length; i++) {
            int temp = r[i];
            int hi = i - 1;
            int lo = low;
            while (lo <= hi) {
                int mid = (lo + hi) / 2;
                if (temp < r[mid]) {
                    hi = mid - 1;
                } else {
                    lo = mid + 1;
                }
            }
            for (int j = i - 1; j >= lo; j--) {
                r[j + 1] = r[j];
            }
            r[hi + 1] = temp;
        }
    }
}

代码强调以下问题
1.边界

1.比较过程中lo会是high的后一位
2.外层循环时不能等于数组长度,会溢出
3.中间值一般是向下取整的
2.时间复杂度 : O(n²)

3.原理,

折半插入之后会缩小比较的范围,插入时依然需要插入点之后的数值依次后移 ?

希尔排序

代码(直接插入的升级版,步长可以自定义)

public class shellsort {
    public static void main(String[] args){
        int[] r = {0,5,2,3,1,10,6,4,7,8};
        // 自定义了一个数组,5为第一次的步长,1为第二次的步长
        int[] delta = {5,1};
        shellsort shell2=new shellsort();
        shell2.shell(r,0,9,delta);
        for (int i : r) {
            System.out.print(i+",");
        }
    }
    public void shell(int[] r, int low, int high, int[] delta){
    for(int k=0 ;k<delta.length;k++){
        shellInsert(r, low, high, delta[k]); //一趟步长为 delta[k]的直接插入排序
    }
    }
    private void shellInsert(int[] r ,int low, int high, int deltaK){
        for (int i=low+deltaK; i<=high; i++) {
            if (r[i] < r[i - deltaK]) { //小于时,需将 r[i] 插入有序表
                int temp = r[i];
                int j = i - deltaK;
                for (; j >= low && temp< r[j]; j = j - deltaK) {
                    r[j + deltaK] = r[j]; //记录后移
                }
                r[j + deltaK] = temp; //插入到正确位置
            }
        }
    }

}


代码强调以下问题
1.边界

待定
2.时间复杂度 : 待定
3.原理,

简单地说,除了步长不一样和直接插入是一样的哦, ?,在复杂一点点的话,就是,会按步长分组,每组内都是直接插入排序,直到按照步长为1的排完序就可以得到最终结果.

小结
感谢您的阅读~~
C#上位机开发:西门子/三菱PLC通信,新手直接上手 对着西门子S7协议文档看半天,连“DB块地址怎么写”都搞不懂;写三菱PLC代码时,分不清MC协议和Modbus的区别,代码改来改去连不上;好不容易跑通代码,换个PLC型号又报错,不知道哪里出问题;后来发现,新手学PLC通信根本不用先啃协议文档——先跑通“能通信”的代码,再慢慢理解底层逻辑,效率至少提升3倍。西门子PLC:用S7NetPlus库(新手最友好),实现以太网通信,支持S7-200 SMART/1200/1500; 阅读详情

相关推荐

Cadence Allegro16.6怎么导出器件引脚信息的报告

当我们需要用到器件的引脚相关信息时,可以利用allegro中的reports这个功能导出器件的相关信息。下面是具体的操作步骤。

suyucheng66的博客 5749

基于比较的常见排序方式

几种常见的基于比较的排序方式 排序简介 交换排序 1.冒泡排序 思想: 两个相邻元素两两比较,依次向后,一趟确定一个元素位置。 说明: 冒泡排序有两层循环,第一层循坏是确定比较趟数,第二层循环确定元素位置,每确定一个元素的位置,检索数组长度减少一位。 实例: 这个数组其实第六趟已经有序了,但是程序还是会继续比较下去,因而可以设置一个状态值来判断数组是否已经有序,读者可以自行编写代码,这里不再展开。 代码: public void bubbleSort(int[] array){ for (int

m0_53120156的博客 2508

MATLAB对pcap文件抓包的读取

应用范围 常用的雷达信号,无线网通信信号的格式大多为pcap、wj文件,这里记录一下MATLAB读取pcap文件的方法,具体处理过程及读取协议针对不同的雷达有不同的处理方式,在这里不做说明。 程序 clc;clear;close all; %% 文件位置 filename= 'E:\File\JOB\JOB_1\data.pcap'; fid = fopen(filename,'r'); % 打开包 tmpPack = fread(fid,1350); % 只读前1350个数 读到

诗酒趁年华的博客 3580

基于比较的七种常见排序算法

本文主要介绍基于比较的七种常见排序算法,分别为:选择排序法,插入排序法,希尔排序法,冒泡排序法,堆排序法,归并排序法,快速排序法。 基于比较的排序算法是指对于元素的排序必须是建立在元素之间是可以比较的。体现在 javajavajava​​​ 语言中为待排序的元素类型是实现了 ComparableComparableComparable​​​​​ 接口的类型。 本文所涉及的复杂度分析都是基于现有结论加上自己的简单的理解,所以可能非常不严谨,大家看看就好,不过最终的结论都是对的。 在分析复杂度的同时也对排序算法

weixin_48084293的博客 9932

5-->详解《switch 数据接收驱动框架、mtk7621集成交换芯片mt7530》之一

SWITCH 交换芯片驱动配置: 一、 配置 MDIO 总线 二、配置 MAC 接口 三、基于 MAC 的 DMA 配置 四、设备驱动结构体 五、数据收发包

weixin_38387929的博客 1万+

COMSOL报错调试总结(不定期更新)

COMSOL报错调试总结1. 可定位错误1.1 除零错误1.2 未定义变量值1.3 边界条件/材料属性等缺失2. 难定位错误2.1. 装配期间内存不足 官方给的案例总是非常完美,运行流畅,结果完美。但是自己做模型时候就总是报错,而且不像自己coding的程序那样可以明确定位哪里出了bug。这里把我碰到的一些报错问题以及调试方法记录下来~ 部分来源于以下参考来源: http://wap.sciencenet.cn/blog-1467490-1118453.html?mobile=1 1. 可定位错误 以下错误

jessica0307的博客 8万+

数据结构之排序算法学习笔记22-12-2

1、定义:排序就是重新排列数列中的元素,使其称为满足按关键字有序的序列。序列有序在实际应用中是非常重要的。简单举个例子来说,如果你要进行按值查找操作,那么有序的序列可以采取折半查找法,而无序的序列只能从头到尾依次查找(假定我们没有其他排序算法的知识基础)。2、算法的稳定性:举例说明,若有一个序列是(12 8 12* 1 4),此时我们可以看到表中有两个值为12的元素,为了方便,我们将一个12加上*来做区分。

weixin_53438051的博客 2636

【ES】--Elasticsearch的分词器深度研究

分词器是ik_max_word,会将“龙马家书”拆分为“龙马”、“马家”、“家书”。然后filter配置的是edge_ngram_filter,在上面拆分的token词组基础上,按照edge_ngram_filter规则进一步拆分。从结果看:分词器是keyword,filter支持edge_ngram_filter,字符过滤器支持tsconvert【简繁体】。分词器是keyword,表明是不进行分词,但filtet中edge_ngram_filter是按照布长方式拆分token,所以得到如此结果。

寻梦友的博客 2440

《数据结构》-第八章 排序(习题)

第八章 排序 排序作为各类数据结构的相应的运算的一种,在很多领域中都有广泛的应用。主要的排序方法有插入排序、交换排序、选择排序、二路归并排序、基数排序、外部排序等各类排序方法。堆排序、快速排序和归并排序是本章的重难点,应深入掌握各种排序算法的思想、排序过程(能动手模拟)和特征(初态的影响、复杂度、稳定性、适用性等)。 本章同样作为考察重点章节,通常以选择题的形式考查不同算法之间的对比。此外,对于一些常用排序算法的关键代码,要达到熟练编写的程度:看到某特定序列,读者应具有选择最优排序...

大家一起进步叭 9262

Cadence PSpice 仿真0:绘制电路图方法图文教程

在使用PSpice进行电路的仿真时,首先需要使用带有PSpice模型的元器件来绘制电路图,本文简单介绍进行电路图绘制是常用的几种需要掌握的方法,以满足PSpice仿真绘制简单电路图所用。

fydar的博客 4705

【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲

CH32V307的通用定时器模块包含一个16 位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉冲宽度或者产生特定频率的脉冲、PWM波等。可用于自动化控制、电源等领域。 输入捕获是通用定时器功能之一,一般用于测量频率和测量脉冲宽度。本文将详细介绍如何通用定时器的输入捕获功能。

视觉与物联智能 2814

【数据结构】第七章 排序

1.排序基本概念 1.拓扑排序是将有向图中所有结点排成一个线性序列,虽然也是在内存中进行的,但它不属于这里所提到的内部排序范畴,也不满足前面排序的定义。 2.对于任意序列进行基于比较的排序,求最少的比较次数应考虑最坏情况。对任意n个关键字排序的比较次数至少为⌈log2(n!)⌉\lceil log_2(n!) \rceil⌈log2​(n!)⌉ 对任意7个关键字进行基于比较的排序,至少要进行几次...

sinat_33438008的博客 5018

基于STM32设计的环境检测系统(OneNet)_365

本项目设计并实现了一种基于STM32F103RCT6单片机的环境检测系统,系统集成了多种传感器模块,具备对环境温湿度、烟雾浓度、易燃气体浓度、一氧化碳浓度和整体空气质量的实时检测功能。系统通过1.44寸SPI接口LCD实现本地数据显示,同时配备有源蜂鸣器用于环境异常报警。在数据通信方面,系统利用ESP8266-WIFI模块,采用MQTT协议将各类传感器数据上传至OneNet云平台,并借助其可视化框架实现网页端可视化界面,可通过电脑和手机浏览器远程访问,实现环境数据的远程监控。该系统设计结构简单、功能全面,适

2195

排序算法总结1一比较排序

我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。   排序算法大体可分为两种:     一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。     另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。   这里我们来探讨一下常用的比较排序算法,非比较排...

weixin_40271182的博客 605

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于比较的排序(一)

七大基于比较的排序 一、直接插入排序 1、原理 整个区间被分成有序区间和无序区间;选择无序区间的第一个元素插入到有序区间合适的位置 2、实现 public static void insertSort(int[] array){ for(int i =1;i < array.length;i++){ //有序区间[0,i) //无序区间[i,array.length) int v = ar...

qq_44743329的博客 179

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

聊一聊插入排序和比较排序

简介 插入排序和比较排序是排序算法中比较基础和简单的两种,其时间复杂度均为O(N2)O(N^{2})O(N2),在分析算法时间复杂度时,我们往往会只会分析比较开销,但是交换开销也确实存在。这里我将综合比较开销和交换开销,来分析一下插入排序和比较排序的区别,以及何时选择插入排序?何时该选择比较排序? 我之前的文章 排序算法详解 里给出了几个基本排序算法的JavaScript版本实现,感兴趣的也可以移步。 空间复杂度 插排和选排的均在交换时使用了一个临时空间,其空间复杂度均为O(1)O(1)O(1)。而且插排和

Hitxzi的博客 608

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

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

排序(一)——排序的分类及比较

排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列。分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。在此我们就针对内部排序——数据结构中的各种排序做一比较。

yc2zgh1314的博客 720

内部排序 (一):各种内部排序方法的比较

作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正! 目录各种内部排序方法的比较地址排序(基于关键字比较的)内部排序在最坏情况下的最快速度 各种内部排序方法的比较 nnn较小/基本有序:可采用简单排序方法(直接插入、简单选择、冒泡排序) nnn较大:可采用快排、堆排。若要求稳定性,则采用归并排序 从平均时间性能上看,快排最佳,但快排在最坏情况下的时间性能不如堆排和归并排序 nnn较大时,归并排序比堆排序用时少,但所需的辅助存储量多 基数排序适用于nnn很大,关键字个数较少的

连理o的博客 3486

内部排序算法之比较排序(一)

内部排序算法指的是数据记录在内存中的排序,通常分为两类:比较排序和非比较排序,接下来主要介绍以下常用几个比较排序算法。冒泡排序基本思想:“轻者上浮,重者下沉”;一趟冒泡的过程:从最左或(最右)侧开始依次比较相邻两个元素大小,每次比较的两个元素记为left,right,若right&lt;left则互换两个元素的值,反之继续向另一侧移动,重复上面的比较,直到到达另一侧;每一趟比较都会有一个元素到达最...

wxb247217的博客 1299

排序算法(一) 三种比较排序

冒泡 vector<int> bubbleSort(vector<int>& nums){ int n = nums.size(); for(int i = n - 1; i >= 0; i--){ bool isSorted = true; // nums(i,n]是有序的 for(int j = 1; j <= i; j++){

Tracker647的博客 1425

排序算法浅析(一)比较排序算法

比较排序算法,就是通过对不同元素的直接比较,确定大小关系,进而将一组数据排序的方法。这种比较可以是相邻元素间的,也可是是不同元素间的。我们通常遇到的如快速排序算法、堆排序算法、冒泡排序等,都是比较排序算法。   下面我将对常见的这几种比较排序算法的算法思想进行简单介绍,并附上实现代码。   一、选择排序算法   遍历一遍数组,选择其中国最小的元素,放在数组的最左边;在剩下的元素中,继续寻找最

邹大海的专栏 1186

java list比较器_Java比较器对数组,集合排序一

数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collator类及其子类RuleBasedCollator,能将排序发挥到极致。1.默认规则的排序String[] array = {"动作","剧情","情感","惊悚","动画","纪录"};List lis...

weixin_35901475的博客 456

排序算法总结2一非比较排序

目录 一. 计数排序(CountingSort) 二. 基数排序(RadixSort) 二.桶排序(BucketSort)       上一篇文章中我们总结了常用的比较排序算法,主要有冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。   这篇文章中我们来探讨一下常用的非比较排序算法:计数排序,基数排序,桶排序。在一定条件下,它们的时间复杂度可以达到O(n)。   这里我们用...

weixin_40271182的博客 209

排序算法总结一(比较类)

排序算法总结(一) 24号上午结束了头疼的四个小时,心里的结算是落了下来,可以回来写文章,这次更加意识菜的不行差的太多,写个文章充实一下自己,总结下最近使用过的排序算法。 排序算法 时间复杂度(平均) 时间复杂度(最好) 时间复杂度(最差) 空间复杂度 稳定性 冒泡排序 O(n2n^{2}n2) O(nn^{}n) O(n2n^{2}n2) O(11^{}1) 稳定 选择排序...

ZQYnn's blog 407

排序算法比较系列一

现在不管是找工作还是考试,排序称为了必考的知识点之一了。 排序分为内部排序内部排序和外部排序。 内部排序: 插入排序: 直接插入排序;折半插入排序;希尔排序。 交换排序: 冒泡排序;快速排序。 选择排序: 简单选择排序;堆排序。 归并排序。 基数排序。 外部排序: 多路归并排序。 具体的如图所示(请原谅字的丑陋):

baiBenny的博客 618

Java比较器对数组,集合排序一

数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collator类及其子类RuleBasedCollator,能将排序发挥到极致。1.默认规则的排序  String[] array = {"动作","剧情","情感","惊悚","动画","纪录"};  List list = new ArrayList();  //该List中放有和array数组同样的数据  Array

shixing_11的专栏 3326
上一篇: avl树
下一篇: [Java]类加载与反射
刘佳欢--hannah
博客等级 码龄11年 82粉丝 138原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值