一篇博客解决常见的排序

常见排序图解 插入类 插入排序 希尔排序 交换类 冒泡排序 快速排序 选择类 选择排序 堆排序 归并类 2-路归并排序 https://www.cnblogs.com/chengxiao/p/6194356.html 分配类 桶排序 https://blog.youkuaiyun.com/qq_37186247/article/details/100834916 基数排序 ... 阅读详情

排序

冒泡排序

在这里插入图片描述

遍历n次数组,如果当前数比后一个数大则将当前
数与后一个数交换位置,每遍历一次可排好一个数
的位置,直到n次,时间复杂度为O(N2),排序满足稳定性

public class BubbleSort {
    public int[] bubbleSort(int[] ints){
        for (int i = 0; i < ints.length; i++) {
            for (int j = 1; j < ints.length-i; j++) {
                int tmp = ints[j];
                if (ints[j]<ints[j-1]){
                    ints[j] = ints[j-1];
                    ints[j-1] = tmp;
                }
            }
        }
        return ints;
    }

    public static void main(String[] args) {
        int[] ints = {2,5,5};
        new BubbleSort().bubbleSort(ints);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }
}

选择排序

在这里插入图片描述

遍历数组,每一次遍历都会从当前位置之后寻找最小的数,并记录最小数的位置,然后将当前值和最小值交换,完整遍历后可以得到一个顺序列表,时间复杂度为O(N2),排序满足稳定性

public class SelectionSort {
    public int[] selectionSort(int[] ints){
        for (int i = 0; i < ints.length; i++) {
            int first = ints[i];
            int tmp = first;
            int index = i;
            for (int j = i+1; j < ints.length; j++) {
                if (ints[j]<tmp){
                    tmp = ints[j];
                    index = j;
                }
            }
            ints[i] = ints[index];
            ints[index] = first;
        }
        return ints;
    }

    public static void main(String[] args) {
        int[] ints = {8,6,9,0,8,3,5,7,7};
        new SelectionSort().selectionSort(ints);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }
}

快速排序

在这里插入图片描述

每次排序前先选择一个基准数,然后把比基准数小的放左边,比基准书大的放右边,具体方法是用两个指针,一个从左到右,一个从右到左,左指针找到比基准数大的数时,将左指针的数和右指针的数交换,然后右指针开始向左找比基准书小的数,找到后和左指针的数交换,直到两个指针相遇,此时数组被分成两个区域,再对这两个区域进行快排递归,直到所有数都排好为止
时间复杂度为O(nlogn),在最坏的情况下为O(N2),且不能保证稳定性

public class QuickSort {
    public int[] quickSort(int[] ints,int left,int right){
        if (left<right){
            int baseNum = ints[left];
            int l = left;
            int r = right;
            while (l<r){
                while (ints[r]>=baseNum&&l<r){
                    r--;
                }
                if (l<r){
                    ints[l] = ints[r];
                }
                while (ints[l]<=baseNum&&l<r){
                    l++;
                }
                if (l<r){
                    ints[r] = ints[l];
                }
            }
            ints[l] = baseNum;
            quickSort(ints,left, r-1);
            quickSort(ints,l+1,right);
        }
        return ints;
    }

    public static void main(String[] args) {
        int[] ints = {2,5,5};
        new QuickSort().quickSort(ints,0,ints.length-1);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }
}

归并排序

在这里插入图片描述

分治的思想,先将整个数组一分为二,再二分为四…直到分成一个部分只有一个元素为止,这是分的思想。将分出来的部分合并为一个有序的部分,两个已经排好序的部分合并就比较容易了,每一次只需要比较头元素的大小,然后选择小的那个加入到中间数组里即可,用递归的方法可以很好的实现这个思想
时间复杂度稳定为O(nlogn),并且能保证稳定性

public class MergeSort {
    public void sort(int[] ints,int left, int right){
        int[] tmp = new int[ints.length];
        if (left<right){
            int mid = (left+right)/2;
            sort(ints,left,mid);
            sort(ints,mid+1,right);
            merge(ints,left,mid,right,tmp);
        }
    }
    private void merge(int[] ints,int left,int mid,int right,int[] tmp){
        int l = left;
        int r = mid+1;
        int index = 0;
        while (l<=mid||r<=right){
            if (l>mid){
                tmp[index++] = ints[r++];
                continue;
            }
            if (r>right){
                tmp[index++] = ints[l++];
                continue;
            }
            if (ints[l]<ints[r]){
                tmp[index++] = ints[l++];
            }
            else {
                tmp[index++] = ints[r++];
            }
        }
        index = 0;
        for (int i = left; i <= right; i++) {
            ints[i] = tmp[index++];
        }
    }

    public static void main(String[] args) {
        int[] ints = {8,6,9,0,8,3,5,7,7};
        new MergeSort().sort(ints,0,ints.length-1);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }
}

堆排序

在这里插入图片描述

将数据重新排列成一个最小堆,即每个结点的父节点都小于其子结点,这样顶部的元素一定是当前堆的最小值,将顶部元素取出并将叶子结点放置到顶部元素,这样操作后可能会破坏最小堆的结构,所以此时需要重新生成最小堆,这样又可以得出这个堆的最小值,这样重复操作,直到所有数都被取出
时间复杂度稳定为O(nlogn),并且保证稳定性

public class HeapSort {
    public void heapSort(int[] ints){
        //形成最小堆
        for (int i = ints.length-1; i > 0;) {
            //只有一个子结点且为左子结点
            if (i%2!=0){
                int father = i/2;
                if (ints[father]>ints[i]){
                    int tmp = ints[father];
                    ints[father] = ints[i];
                    ints[i] = tmp;
                }
                i--;
            }
            else {
                int father = (i-1)/2;
                int small = ints[i]<ints[i-1]?ints[i]:ints[i-1];
                int smallIndex = ints[i]<ints[i-1]?i:i-1;
                if (small<ints[father]){
                    int tmp = ints[father];
                    ints[father] = ints[smallIndex];
                    ints[smallIndex] = tmp;
                    arrange(ints,smallIndex, ints.length);
                }
                i-=2;
            }
        }
        int lastIndex = ints.length-1;
        for (int i = 0; i < ints.length; i++) {
            int tmp = ints[lastIndex];
            ints[lastIndex--] = ints[0];
            ints[0] = tmp;
            arrange(ints,0,lastIndex+1);
        }
    }
    private void arrange(int[] ints,int index,int intsLength){
        int leftChildIndex;
        int rightChildIndex;
        //判断有无左子节点
        if (index*2+1<intsLength){
            leftChildIndex = index*2+1;
            //有两个结点的情况
            if ((index+1)*2<intsLength){
                rightChildIndex = (index+1)*2;
                int small = ints[leftChildIndex]<ints[rightChildIndex]?ints[leftChildIndex]:ints[rightChildIndex];
                int smallIndex = ints[leftChildIndex]<ints[rightChildIndex]?leftChildIndex:rightChildIndex;
                if (small<ints[index]){
                    int tmp = ints[index];
                    ints[index] = ints[smallIndex];
                    ints[smallIndex] = tmp;
                }
                arrange(ints,smallIndex,intsLength);
            }
            //只有一个子节点的情况
            else {
                if (ints[leftChildIndex]<ints[index]){
                    int tmp = ints[index];
                    ints[index] = ints[leftChildIndex];
                    ints[leftChildIndex] = tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        int[] ints = {1,2,3,4,5,6,7,8,9,10,11};
        new HeapSort().heapSort(ints);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(ints[i]);
        }
    }
}

更多内容

更多内容请看我的个人网站,新建网站,目前内容较少,敬请期待

LeetCode 排序数组(八种常见排序算法) 给定一个整数数组 nums,将该数组升序排列。 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 提示: 1 <= A.length <= 10000 -50000 <= A[i] <= 50000 思路分析:\color{blue}思路分析:思路分析:排序问题是算法中最为经... 阅读详情

相关推荐

一文读懂客户健康度

什么是客户健康度?客户健康度为什么重要?怎么计算客户健康度?这篇文章,我们来聊聊。

m0_62700043的博客 1420

java sort算法名称_快速排序算法(Quick Sort)(java)

/*** 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序。* @author liuy*/public class QuickSort {public static void quickSort(int[] array) {quickSort(array, 0, array.length - 1);}public static void quickSort(int[] arra...

weixin_33771582的博客 168

ESP32-S3 SPI接口实战:从引脚分配到高速通信配置

本文详细解析了ESP32-S3的SPI接口配置与高速通信优化技巧,从引脚分配到软件配置,再到DMA传输和时钟优化,帮助开发者快速掌握SPI通信技术。特别针对ESP32-S3的SPI2接口进行了实战演示,包括硬件连接和常见问题排查,适用于各类嵌入式开发项目。

weixin_29189373的博客 679

快速排序算法QuickSort

 1.说明 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本,因为...

weixin_34054866的博客 168

PyTorch GPU版本安装避坑指南:解决RuntimeError: No CUDA GPUs are available报错

本文详细解析了PyTorch GPU版本安装过程中常见的`RuntimeError: No CUDA GPUs are available`报错问题,从硬件驱动检查、CUDA Toolkit与cuDNN安装到PyTorch GPU版本的正确配置,提供了全面的避坑指南和实战验证方法,帮助开发者高效搭建深度学习开发环境。

r2s3t4的博客 298

9.6华为OD机试真题 新系统 - 少儿爬山闯关积分游戏 (Java/Py/C/C++/Js/Go)

2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型。

算法大师! 860

常见的7种排序算法

1、冒泡排序 最简单的一种排序算法。假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置,此时数组最右端的元素即为该数组中所有元素的最大值。接着对该数组剩下的n-1个元素进行冒泡排序,直到整个数组有序排列。算法的时间复...

ispurs的博客 32万+

系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例)

系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。

qq_41854911的博客 3055

第一篇博客,从几种排序算法开始

第一篇博客,从几种排序算法开始 几种基本常见的排序算法 冒泡排序 简单选择排序 简单插入排序 希尔排序 快速排序 堆排序 二路归并排序 计数排序 桶排序 基数排序 冒泡排序 顾名思义,该排序过程类似水开时大气泡不断上升的过程,即当前元素不断与后一元素比较,较大是交换,一直交换到数组末尾的过程 代码实现 /** * 冒泡排序 * 把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。 * ...

山海可平的博客 455

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

VisionPro 机器视觉案例 之 硬币识别

CogPMAlignTool模板匹配工具 掩模

机器视觉李小白的博客 1893

python 排序统计滤波器_【干货分享】测试开发必须要知道的Python面试题

互联网寒冬,大家过得还好吗?年终奖发了多少?最近感觉不少朋友都在刷 leetcode 了,年后打算看机会的,应该都蠢蠢欲动了吧。我这里有一份精选的python面试题,测试开发方向的,由我和同行们在实际面试当中收集的,作为新年大礼送给大家。希望能对大家有帮助!先看看目录吧tips:本文带有答案的,我已经标“ ”,方便查看。必考面试题 如何去除列表中的重复元素 八大排序算法合集 斐波那契数列的pyth...

weixin_33308507的博客 131

图神经网络实战(2)——图论基础

图论 (Graph theory) 是数学的一个基本分支,涉及对图研究。图是复杂数据结构的可视化表示,有助于理解不同实体之间的关系。图论提供了大量建模和分析现实问题的工具,如交通系统、社交网络和互联网等。在本节中,将介绍图论的基本原理,主要涉及三个方面:图属性、图概念和图算法。

盼小辉丶的博客 1万+

一篇博客读懂排序

学到这里,其实这些分布的并非是真正的希尔排序,gap到底取多少的值?其实画图把整个流程完整的走一遍我们就可以知道我们的目的是为了让prev和cur指针中间的值都是比key大的值,然后prev++负责记录下一个大的值,cur负责记录比key小的值,每次找到就交换,最后再把prev的值变为key即可。下面我们先来完成单趟,选用一个key值作为基准值,小的排在左边,大的排在右边,这样一次可以把整个数组分为两部分,然后我们还要进行基准值位置的调整,此时的left位置就是key应在的位置。

m0_75186846的博客 1283

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

详解常见排序

超级详细的讲解了插入排序,希尔排序,选择排序,冒泡排序,堆排序,快速排序,归并排序以及基数排序。

. 33万+

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

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

Mysql实现查询博客的上一篇和下一篇功能的实现

在完善自己的博客功能中,需要实现在当前博客阅读完尾部实现链接到上一篇个下一篇功能,那么如果实现呢。 思路就是根据当前博客的id拿到比它打经排序后id最小的一条和拿到比它小排序后id最大的一条,也就是它的下一篇和上一篇。 sql语句如下: (select * from content where id < 3 order by id desc limit 1) union all(selec...

September的博客 855

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【C++】常见的几种排序算法

借用了这位大哥的图片:链接,也可以看此博客讲解直接插入排序。 这位大哥做了每种排序的讲解博客,很不错强推。。 此博客只为方便学习,造福人类。 (1)冒泡排序 冒泡排序的思路是数小的像泡泡一样冒出来,反过来我们可以理解为,数大的像石头一样沉下去。 我们遍历数组,从左到右,若右边的数比左边的大,则交换。 第一遍:最大的数沉下去 第二遍:第二大的数沉在倒数第二个位置 … 版本二为常见常用版本,版本三在二的基础上优化,避免了不需要的排序 class Sloution { public: //冒泡:时间复杂度O

zdb 7291

一篇博客串通数据结构所有常见排序方式(复习,预习兼用)(上)

数据结构这门课有一单元是专讲排序的,不过课本上密密麻麻的代码可读性较差,而且容易前学后忘,我也不是第一次学了,隔一段时间不用就会忘了一些细节。本人也是自己给自己写一个总结,采用:名词预览+逻辑大白话+代码展示+细节聚焦+复杂度分析+应用场景的方式,方便掌握本人倾向于cpp算法,不像c那么繁琐冗赘,也足够细节。很多同学可能不知道“稳定性”到底指的是什么,其实就是指你这个排序会不会破坏原来默认的已有的顺序,比如a,b都等于2,但是默认情况下a在b前面,但是经过了你的排序之后,b排到a后面去了,仅从大小关系来看,

BugMonsterlulu的博客 991

常见排序算法

直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、计数排序

海盗猫鸥的博客 1929

【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

分享学习知识地方 2193

常见的排序

常见的10大排序,这里先详细的介绍前7种排序;稳定性定义:如果两个元素具有相同的关键字,那么在排序后他们的相对顺序不变;排序前有标记的5在前面,排序后依旧在前面即稳定,如果位置互换了就不稳定;

2302_79712403的博客 1131

数组排序常见的7种方法

数组排序 1、桶排序(桶中出现的数组元素都做个标记1,然后将桶数组中有1标记的元素依次打印) //简单, 但是不用,浪费内存 var arr2=[]; for(var i=0;i<arr.length;i++){ var key=arr[i]; arr2[key]=1; } for(var j in arr2){ console.log(j); } 2、冒泡排序(每一趟找出最大的) for(var i =0,len= arr.length;i<len;i++){ // arr[i] // 前面的

tylls的博客 3149

排序(7种常见排序方法)

常见的排序算法:按照分:1.直接插入排序 2.希尔排序按照分:1.选择排序 2.堆排序按照分:1.冒泡排序 2.快速排序按照分:1.归并排序常见的排序思想:是使用双指针或者三指针,在同一个数组上遍历、比较、交换。

Kai的学习笔记 4433

常见排序详解

插入排序:直接插入排序、希尔排序;选择排序:选择排序、堆排序;交换排序:冒泡排序、快速排序;归并排序:归并排序;

qq_58674902的博客 1127
上一篇: Java多人视频通信(不定时更新)
下一篇: buflab-计算机系统实验
南懿烨曦
博客等级 码龄6年 108粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值