一篇博客解决常见的排序

常见排序图解 插入类 插入排序 希尔排序 交换类 冒泡排序 快速排序 选择类 选择排序 堆排序 归并类 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}思路分析:思路分析:排序问题是算法中最为经... 阅读详情

相关推荐

告别天价授权!手把手教你用TwinCAT 3.1搭建EtherCAT主站(Windows 10/11保姆级教程)

本文详细介绍了如何在Windows 10/11系统上使用TwinCAT 3.1免费搭建EtherCAT主站,帮助中小企业和个人开发者低成本实现工业自动化。从环境准备、许可证策略到安装配置和实战开发,提供保姆级教程,涵盖PLC编程、运动控制及硬件选型建议,助您轻松入门工业控制领域。

weixin_30664615的博客 363

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

SPD5 集线器协议内容解析

​ 若不同SPD5 Hub后面的本地侧设备同时发送请求,则是22和23、24的混合过程,先通过LID裁决,再通过HID裁决,这里的LID是本地设备的,若LID一致,则看HID,由于SPD5 Hub的本地侧设备HID均为111,因此实际上是比较SPD5 Hub的HID,这个过程在前文提到,SPD5 Hub会转换HID。​ 若MR27[4]=1且MR27[3:0]=1,如果MR51[3:0]=1时,发送IBI,并且MR48[7]置1,将GETSTATUS CCC的待处理中断位[3:0]更新为0001。

weixin_50591344的博客 3860

快速排序算法QuickSort

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

weixin_34054866的博客 168

极化码理论及算法研究4-巴氏参数、GA算法以及matlab仿真

目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 极化码编码 ...

1万+

【ArcGIS】ArcMap中北京1954坐标系转WGS84的实战技巧与参数选择

本文详细解析了在ArcMap中将北京1954坐标系数据转换为WGS84坐标系的完整流程与核心技巧。针对常见的坐标偏移问题,文章首先强调了数据“归位”的重要性,并提供了处理假东、假北值的具体操作步骤。随后,重点阐述了地理变换参数(如Beijing_1954_To_WGS_1984_2)的选择逻辑及其对转换精度的决定性影响,并结合案例说明了参数选择、中央经线确认及结果验证等关键环节,旨在帮助用户高效、准确地完成坐标转换。

f6g7h8i9j的博客 330

常见的7种排序算法

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

ispurs的博客 32万+

KG²RAG框架:知识图谱增强大模型检索生成技术解析

知识图谱(Knowledge Graph)作为结构化知识表示的重要方式,与向量检索技术结合形成了新一代检索增强生成(RAG)框架。其核心原理是通过图神经网络编码器提取子图特征,并与文本向量空间对齐,实现结构化与非结构化知识的协同检索。这种技术显著提升了专业领域问答的事实准确性,在医疗诊断、金融分析等需要高可靠性响应的场景中具有重要价值。KG²RAG框架创新性地采用双通道处理架构,结合Neo4j等图数据库与Milvus向量数据库,通过动态检索调度器智能选择最优检索路径。实测表明该方案能降低40%以上的事实错误

weixin_29306875的博客 107

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

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

山海可平的博客 455

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3206

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

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

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

weixin_33308507的博客 131

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

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

一篇博客读懂排序

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

m0_75186846的博客 1283

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

详解常见排序

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

. 33万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

September的博客 855

【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、付费专栏及课程。

余额充值