各种排序算法

【C++】排序算法 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序、快速排序、计数排序、基数排序、桶排序、外排序 阅读详情

githuab链接:

https://github.com/William-Hai/ArraySortAlgorithm

插入排序

直接插入排序

详解链接:

http://blog.youkuaiyun.com/lemon_tree12138/article/details/50968422

回忆:
时间复杂度?(三种),空间复杂度,稳定性?
外层循环多少次?内层主要功能?循环条件?

public static void insertSort(int[] arr){
        for(int i=1;i<arr.length;i++){//插入次数
            int j=i-1;
            int waitinsert = arr[i];//待插入元素
            while(j>=0 && arr[j]>waitinsert){//比较大小是否后移,j-1是比较的索引
                arr[j+1]=arr[j];//后移
                j--;
            }
            arr[j+1]=waitinsert;//后移后,指针前移了。所以j+1
        }
}
int[] a= {4,3,6,5,9,0,8,1,7,2};
3 4 6 5 9 0 8 1 7 2 //    a[1]
3 4 5 6 9 0 8 1 7 2 //    a[3](a[2]有序不插入)
0 3 4 5 6 9 8 1 7 2 //    a[5](a[4]有序不插入)
0 3 4 5 6 8 9 1 7 2 //    a[6]
0 1 3 4 5 6 8 9 7 2 //    a[7]
0 1 3 4 5 6 7 8 9 2 //    a[8]
0 1 2 3 4 5 6 7 8 9 //    a[9]



希尔排序

参考链接1:
http://www.cnblogs.com/jingmoxukong/p/4303279.html
参考链接2:
http://blog.youkuaiyun.com/lemon_tree12138/article/details/51127533

这里写图片描述

gap=5时,即分5组:
{9,4}
{1,8}
…
(从上述两个5看出,不稳定)
从插入排序到希尔排序的演变

  1. 缩小增量排序,每个组中采用插入排序。
  2. 增量为1时结束排序。

比直接插入多以下步骤:
1.首先设定步长,然后while循环,指只到步长为1;
2.接下来相当于步长次的直接插入操作;
3.接下来写直接插入排序即可,只是步长不是1了。

public static void shellSort(int[] arr){
        int gap = arr.length/3+1;
        //int gap=arr.length/2;
        while(gap>=1){

            for(int k=0;k<gap;k++){//1.确定插入排序的次数,步长gap,即gap次

                //2.对于其中的每一次,从后一次开始,以下是直接插入排序
                for(int i=gap+k;i<arr.length;i=i+gap){
                    //3.将待插入的元素存为临时变量
                    int waitinsert=arr[i];
                    int j=i-gap;//第一次比较,从j前一个元素开始
                    while(j>=0 && arr[j]>waitinsert){
                        arr[j+gap]=arr[j];
                        j=j-gap;
                    }
                    arr[j+gap]=waitinsert;
                }

            }
            System.out.println(Arrays.toString(arr));
            if(gap==1) break;
            gap=gap/3+1;
            //gap=gap/2;
        }
    }

    public static void main(String[] args) {
        int[] a={4,3,6,5,9,0,8,1,7,2};
        shellSort(a);
    }
[4, 0, 6, 1, 7, 2, 8, 5, 9, 3]
[4, 0, 6, 1, 7, 2, 8, 3, 9, 5]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

选择排序

算法原理

重点:选择交换

(1)从待排序序列中,找到关键字最小的元素;

(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;

(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。

这里写图片描述

算法实现

public static void simpleSelect(int[] arr) {
    for(int i=0;i<arr.length;i++){//遍历次数,第i个元素与后边所有的比

        int minIndex=i;
        for(int j=i+1;j<arr.length;j++){//找一个最小的位置
            if(arr[j]<arr[minIndex]){
                minIndex=j;
            }
        }

        if(i!=minIndex){//本身不是最小的,就交换
            int t=arr[minIndex];
            arr[minIndex]=arr[i];
            arr[i]=t;
        }
    }
}

算法复杂度

这里写图片描述

交换排序

冒泡排序

算法原理

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
                                       — 《大话数据结构》
                               

这里写图片描述

算法实现

public static void bubble(int[] arr){
    for(int i=1;i<arr.length;i++){
        for(int j=0;j<arr.length-i;j++){
            if(arr[j+1]<arr[j]){
                int t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
}

算法复杂度

排序方法时间复杂度空间复杂度稳定性复杂性
平均情况最坏情况最好情况
冒泡排序(教科书版)O(n2)O(n2)O(n)O(1)稳定简单

快速排序

算法原理

基准数、左游标、右游标

分析1:

首先设置一个临时变量用来存放随机取出数组中的一个数,一般我们取数组的第一个元素也就是说temp=a[0],同时设置两个游标分别指向数组第一个元素和最后一个元素。

这里写图片描述

算法的基本运算步骤为:

  1. 依次比较数组的后游标所指与temp的大小,如果temp< a[j],则j–,直到遇到第一个temp>a[j],则停止移动

  2. 依次比较数组的前游标所指与temp的大小,如果temp > a[i],则i++,直到遇到第一个temp < a[i],则停止移动

  3. a[i]与a[j]交换

  4. 判断i是否等于j,如果不相等则循环1、2、3步,直到i等于j,则完成一次快速排序。

分析2:

分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。
先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=0),指向数字6。让哨兵j指向序列的最右边,指向数字8。

这里写图片描述

首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)。哨兵j一步一步地向左挪动(即j–),直到找到一个小于6的数停下来。
接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。

这里写图片描述

现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下:
6 1 2 5 9 3 4 7 10 8

到此,第一次交换结束。接下来开始哨兵j继续向左挪动(再友情提醒,每次必须是哨兵j先出发)。他发现了4(比基准数6要小,满足要求)之后停了下来。哨兵i也继续向右挪动的,他发现了9(比基准数6要大,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下:

6 1 2 5 4 3 9 7 10 8

这里写图片描述
这里写图片描述

第二次交换结束,“探测”继续。哨兵j继续向左挪动,他发现了3(比基准数6要小,满足要求)之后又停了下来。哨兵i继续向右移动,糟啦!此时哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。说明此时“探测”结束。我们将基准数6和3进行交换。交换之后的序列如下:

3 1 2 5 4 6 9 7 10 8

这里写图片描述
这里写图片描述
这里写图片描述

到此第一轮“探测”真正结束。此时以基准数6为分界点,6左边的数都小于等于6,6右边的数都大于等于6。回顾一下刚才的过程,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。

OK,解释完毕。现在基准数6已经归位,它正好处在序列的第6位。此时我们已经将原来的序列,以6为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。接下来还需要分别处理这两个序列。因为6左边和右边的序列目前都还是很混乱的。不过不要紧,我们已经掌握了方法,接下来只要模拟刚才的方法分别处理6左边和右边的序列即可。

这里写图片描述

参考链接:
http://blog.youkuaiyun.com/yzllz001/article/details/50982841            

算法实现

实现重点:基准数、左游标、右游标

public static void fastSort(int[] a, int leftIndex,int rightIndex){

        if(leftIndex>=rightIndex){//很重要,递归结束条件
            return;
        }

        int key=a[leftIndex];//基准数选取,选法有很多
        int i=leftIndex;
        int j=rightIndex;
        while(i!=j){
            while(a[j]>=key && i<j){
                j--;
            }
            while(a[i]<=key && i<j){
                i++;
            }
            if(i<j){
                int t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        //while执行完毕,即i=j时,基数归位
        a[leftIndex]=a[i];
        a[i]=key;

        //继续处理左边的和右边的,递归过程
        fastSort(a, leftIndex, i-1);
        fastSort(a, i+1, rightIndex);

    }
    public static void main(String[] args) {
        int[] a={4,3,6,5,9,0,8,1,7,2};
        fastSort(a, 0, 9);
        System.out.println(Arrays.toString(a));
    }
排序算法:稳定的排序算法 元素,并围绕主元对列表进行分区,将较小的元素放入低数组中,将所有较大的元素放入高数组中。然后,我们对他们的第十位的值进行排序。因此,我们可以对任意大小的列表进行排序,而无需在冒泡排序中使用任何额外的空间。我们可以说,子问题可以被视为对数组的一部分进行排序,从任何索引 s(start) 开始,到任何索引 e(end) 结束。正如我们上面所讨论的,最大堆是一个完全二叉树,其中每个内部节点中的值都大于或等于该节点的子节点中的值。此外,每次迭代后,已排序子数组的大小都会增加,而未排序子数组的大小会减少。 阅读详情

相关推荐

八种排序算法

偶尔有看到排序算法,想起来大学里老师也有讲授过冒泡排序、快速排序等,不过现在已经没什么概念,一查发现排序算法有八种,有的甚至连名字都没听过,感概平时看的少。既然已经看到了,就干脆了解下基础概念,避免在后续学习途中,出现一看就懵逼的情况。   冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到...

dobat的博客 3348

九大排序算法再总结

如果要转载,需要注明出处: http://blog.youkuaiyun.com/xiazdong 本文是 http://blog.youkuaiyun.com/xiazdong/article/details/7304239 的补充,当年看了《大话数据结构》总结的,但是现在看了《算法导论》,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍。 本文首先介绍了基于比较模型的排序算法,

xiazdong 31万+

排序算法总结及C++实现

文章目录1 引入 认识时间复杂度2 补充 对数器3 排序算法分析3.1 基于比较的排序3.1.1 冒泡排序3.1.2 选择排序3.1.3 插入排序3.1.4 归并排序补充题目 小和问题补充题目 逆序数3.1.5 快速排序3.1.6 堆排序3.2 非基于比较的排序3.2.1 计数排序3.2.2 桶排序3.2.3 基数排序4 排序总结4.1 稳定性4.2 工程中的综合排序算法4.3 有关排序...

李滚滚的博客 2222

「排序算法」十大经典排序算法

文章目录十大经典排序算法一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序 引用网站:菜鸟教程十大经典排序 十大经典排序算法 排序算法图片总结(图片来源于网络) 一、冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢

秋天,黄叶坠地,凉风有信。 6427

排序算法 - 面试中的排序算法总结

排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。 一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对

从零开始 2982

文档多模态识别工具对比:MinerU、PaddleOCR、Marker

本文对比了三款文档多模态识别工具:MinerU、PaddleOCR和Marker。MinerU专注于中文文档的端到端解析,支持复杂元素提取和结构化输出,适合中文论文和教材解析。PaddleOCR是通用OCR工具包,支持多语言和全流程任务,适用于发票、车牌等图像OCR。Marker则注重多语言支持和轻量化部署,适合英文论文和技术文档的快速转换。三者在核心技术、中文优化、表格处理、输出格式、部署复杂度和适用语言等方面各有优劣。选型建议根据具体需求:MinerU适合高精度中文解析,PaddleOCR适合定制化OC

朴拙科技的博客 4742

【排序算法】排序算法总结

排序算法总结,将排序算法的分类、稳定性和特点进行一个总结,并附有跳转到对应详解的链接,方便大家学习

weixin_52811588的博客 979

CVPR2023新作HAT实战:5分钟搞定图像超分辨率重建(附代码)

本文介绍了CVPR2023新作HAT模型在图像超分辨率重建中的实战应用。HAT通过创新的混合注意力机制,显著提升了图像重建质量,能激活更多有效像素并减少伪影。文章提供了从环境配置到模型部署的完整指南,帮助开发者在5分钟内快速实现图像超分辨率重建,并附有代码示例和性能优化技巧。

weixin_29062613的博客 236

稳定排序算法有哪些

稳定排序算法有哪些 相信您已经掌握了很多种排序算法,比如冒泡排序、插入排序、希尔排序、选择排序等。这些排序算法中,有些是 “稳定” 的,有些是 “不稳定” 的。 给定的待排序序列中,经常会包含相同的元素,例如: 3 1 2 4 2 此序列中包含两个元素 2,为了区分它们,我们分别称它们为 “红 2” 和 “绿 2”。 评价一个排序算法是否稳定,是指该算法完成排序的同时,是否会改变序列中相同元素的相对位置。例如,上面序列中红 2 和绿 2 的相对位置是:红 2 位于绿 2 的左侧,或者说绿 2 位于红 2

ccc369639963的博客 1万+

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 454

智能车竞赛飞檐走壁组立体赛道电磁引导线设计与实现

本文深入解析了智能车竞赛飞檐走壁组立体赛道电磁引导线的核心设计与实现。针对垂直面、圆筒、跷跷板等立体元素,详细阐述了电磁线规格参数选择、三维空间铺设技巧及磁场调试方法,旨在帮助参赛队伍打造稳定可靠的导航系统,提升车模在复杂立体赛道上的通过率与稳定性。

bert9linguist的博客 279

什么是排序算法?常见的排序算法有哪些?

计数排序适用于数据范围较小且已知的情况,其时间复杂度为线性时间,非常适合处理小范围内的数据排序。基数排序适用于整数排序,特别是当数据范围较大但数据量适中时。它通过多次应用计数排序来实现多轮排序,从而克服了传统排序算法在处理大范围数据时的效率问题。

破损的天堂鸟博客 1225

【75】OpenCV C++实战篇——OpenCV 图像拼接、全景拼接(教程合集)

本文整理了OpenCV实现图像拼接的技术教程合集,涵盖C++和Python两种语言实现方案。图像拼接技术旨在将多张重叠图像融合为无缝全景图,既扩大视角又保持高分辨率。内容包含水平矫正等关键步骤(附对比效果图),提供多个实战案例的完整代码和详细讲解,涉及单应性矩阵、图像变换等核心技术。不同案例展示了从两张到多张图像的拼接效果,适合不同层次的学习者参考实践。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 528

排序算法详解

排序算法是计算机科学中最基础也最重要的算法之一。它将一组数据(例如数字列表、字符串集合)按照特定的顺序(升序或降序)重新排列。高效的排序算法对于优化其他算法(如搜索和合并算法)的效率至关重要。

m0_54069809的博客 1168

AUTOSAR AP——SM模块

对AUTOSAR AP中状态管理模块SM,从模块定义、总结等多方面进行了介绍。

weixin_43627682的博客 284

【35】软考软件设计师——设计模式代码填空(C++版)满分精讲|第5/6题二选一必考

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第35篇,聚焦下午选做题**第5/6题C++版设计模式代码填空**,与上一篇Java版形成双子配套,单题分值稳定12~15分。全文超4000字深度拆解C++独有核心考点:虚函数/纯虚函数、构造与析构函数规范、继承权限、模板类编程在设计模式中的应用;精讲单例、工厂、策略、观察者、适配器五大高频模式的C++专属代码写法,标注所有填空核心点位、语法陷阱、内存安全规范

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 543

十大经典排序算法

十种常见的排序算法可分为以下两大类: 比较类排序:通过比较来决定元素间的相对位置,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对位置,它可以突破基于比较排序的时间下限,以线性时间运行,因此也称为线性时间非比较类排序。 时间复杂度: 从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。

qq_40896594的博客 3672

【YOLOv11】014、YOLOv11模型导出:PyTorch到ONNX格式转换与优化

摘要:本文详细介绍了如何将PyTorch训练的YOLOv11模型高效转换为ONNX格式。重点包括:分离模型特征提取与后处理、设置动态维度、优化ONNX算子、验证转换正确性等关键步骤。作者分享了实际项目中的经验教训,如版本对齐、算子兼容性处理、后处理分离等实用技巧,并推荐使用onnx-simplifier工具优化模型。文章强调模型转换是一个需要反复调试的过程,建议保留转换记录形成知识库,以提高部署效率并避免常见错误。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 304

十大排序算法

算法稳定性:单次比较后,两个值相等的邻近元素的位置在排序后,相对位置没有改变。

一名想做出点成就的后端~ 1428

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

排序算法总结

1.排序算法分类 基础的排序算法包含冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序及快速排序。 根据实现类型可分为插入排序类、选择排序类、交换排序类及归并排序类。 2.排序算法的综合分析 各算法的排序方式、平均情况、最好最坏情况、所需的辅助空间及稳定性如下: 事实上,排序算法没有十全十美,本来想写一套模拟测试的数据来验证孰优孰略。但是突然发现可比性不高,需要根据

黄俊彬 2540

VC中sqlite的使用

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

排序算法-10种排序算法

文章目录一、排序算法是什么?1.解释2.内部排序3.外部排序二、排序算法介绍及实现1.冒泡排序算法描述四、测试 一、排序算法是什么? 1.解释 这里引入百度百科的解释: 谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。 在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。 2.内

GGB__的博客 931

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅解排序算法

排序算法是计算机科学中的基础算法,用于将数据按特定规则排列。根据性能和应用场景可分为三类:1)基础排序(O(n²))如冒泡、插入排序,适合小数据量或接近有序的数据;2)高级排序(O(nlogn))如快速、归并和堆排序,适合中等规模数据,其中快排平均性能最优,归并稳定但需额外空间;3)非比较排序(O(n))如计数、桶和基数排序,适用于特定范围或分布均匀的数据。选择算法需综合考虑数据规模、特征(如是否重复)、内存限制及稳定性要求。

youngerwang的博客 1150

常见排序算法详解

排序是我们在日常生活和工作中常见的一种操作。在计算机科学中,排序算法就是将一串或一组数据按照特定的顺序进行排列的算法。这些顺序可能是数字的升序或降序,也可能是字母或字词的字母顺序等。我们将探讨几种不同的排序算法,包括他们的原理、优缺点以及代码实现。常见的排序算法包括:冒泡排序、快速排序、插入排序、选择排序、希尔排序、归并排序、堆排序、基数排序等。这些排序算法中,有些是比较排序,即通过比较元素之间的关系进行排序;

沐雨风栉 873

浅谈经典排序算法系列—各种排序算法总结

排序算法的稳定性定义: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。 稳定性判定方法: 对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特

Tham 在思索中前行! 1081

排序算法--如何分析、评价一个排序算法的优劣

学习排序算法感觉有种回到高中做数学题的感觉,需要深入的理解这些排序算法,才能真正的掌握它。 如何评价、分析一个排序算法? 一)、排序算法的执行效率 如何来评估排序算法的执行效率呢 1、最好情况、最坏情况、评价情况的时间复杂度 对于要排序的数据,有的接近有序,有的完全无序,而排序数据的有序度会影响算法的执行时间,我们需要知道排序算 法在不同数据下的性能表现 2、时间复杂度的系数、常量、低阶 时间复杂度是随规模n增长的变化趋势。对于规模很小的数据,如...

铭 3147
上一篇: Mybatis(一)
下一篇: this和super
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值