【求职·算法基础】八大排序算法

从“Hello World”到区域赛银牌:我的ACM算法打怪升级全记录(附各阶段工具包) 本文记录了作者从编程新手到ACM区域赛银牌获得者的完整学习历程,详细分享了各阶段的算法学习路线、刷题策略和实战经验。涵盖从基础算法到动态规划的系统训练方法,并附赠经过竞赛检验的工具包和资源清单,为算法竞赛爱好者提供实用参考。 阅读详情


经典排序算法总结

八大排序算法原理、手写思路、java代码实现

小贴心:对数器的使用
1、对数器:重复多次(eg. 5000次),每次随机生成随机长度的矩阵,用正确方法排序的结果和自己排序的结果进行比较,每次完全一致说明排对了,反之排序不对。
2、过程:自己预先定义最原始(暴力解法,即保证排序正确既可,不考虑时间空间复杂度)的方法对数组arr进行排序,排序后的数组为arr1;然后和自己设计的排序算法排序的结果arr2 进行比较。

1、BubbleSort 冒泡排序

1)原理

1、给定数组arr,定位到最后一个位置数num,用num之前的每个数和num比较,比num大则和num交换,使得第一轮找到数组最大数并放在最后位置。
2、num向前移一位,再用其前的数和其比较,最后得到数组第二大的数,放在倒数第二位置。
3、就酱循环
4、直到到达第一个数,即排序好。

2)手写思路

3)代码

  public static  void bubbleSort(int[] arr){
        if(arr == null || arr.length <2){
            return ;
        }
        for (int i = arr.length-1; i>0 ; i--) {
        //从后往前排
            for (int j = 0; j < i; j++) {
                if(arr[j] > arr[j+1]){
                    swap(arr,j,j+1);
                }
            }
        }
    }

2、SelectionSort 选择排序

1)手写思路

2)代码

public static  void selectionSort(int[] arr){
        if(arr == null || arr.length <2){
            return;
        }
        for (int i = 0; i < arr.length-1; i++) {
            int minIndex = i;
            for (int j = i+1; j < arr.length; j++) {
                minIndex = arr[j] < arr[minIndex] ? j:minIndex;
            }
            swap(arr,i,minIndex);
        }
    }

3、InsertSort 插入排序

1)原理

1、首先假设第i个数(i=0)排好
2、从i=0开始,让arr[i]和其左边的数(遇到边界则i++)依次比较,若小于,则交换。

2)手写思路

在这里插入图片描述

3)代码

       public static  void insertSort(int[] arr){
        if(arr == null || arr.length <2){
            return ;
        }
        for (int i = 1; i<arr.length ; i++) {
            for (int j = i-1; j>=0 && arr[j] > arr[j+1]; j--) {
                //j>= 0 是边界,不要越界
                swap(arr,j,j+1);
            }
        }
    }

4、Merge Sort 归并排序

1)原理

1、数组首先找中点进行二分,二分后再二分,直到不能二分只剩一个数
2、从上面的那一个数开始向上归并(即和其他的数按照大小放置在一起)

2)手写思路

1、二分和归并过程

2、归并原理 例如:图中L和R归并

3)代码

public static void mergeSort(int[] arr){
        if(arr == null || arr.length<2){
            // 如果空数组或只有1个数根本不用排序
            return;
        }
        sortProcess(arr,0,arr.length-1);
    }

    public static void sortProcess(int[] arr,int L,int R){
        if(L == R){ // 说明只剩下1个数了,不需要再分
            return ;
        }
        //分成两半
        int mid = L + ((R-L) >> 2); //L和R 中点位置,(L+R)/2
        //左边排序
        sortProcess(arr,L,mid); //T(N/2)
        //右边排序
        sortProcess(arr,mid+1,R);//T(N/2)
        //
        merge(arr,L,mid, R); //O(N)
        //T(N) = 2 T(N/2) + O(N) = NlogN
    }

    //对指定长度,L到R之间进行排序
    public static void merge(int[] arr, int L ,int mid, int R){
        int[] help = new int[R-L + 1];  //辅助数组存放 共有R-L个数
        int i = 0 ;
        int p1 = L;  // 指针指向L
        int p2 = mid +1; // 指针指向mid+1

        while(p1<=mid && p2<= R){
            help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
            //此过程 若<,则help[i]=arr[p1], 然后 p1后移,i后移;
            //      若>,则help[i]=arr[p2], 然后 p2后移,i后移;
        }

        // 上述循环跳出时 说明p1 和p2 中必且只有一个已经越界(遍历完),
        // 下面2个while只会执行其中1个

        // 当p2越界,说明p2执行完,直接将p1剩下的放在后面
        while(p1<=mid){
            help[i++] = arr[p1++];
        }
        // 当p1越界,说明p1执行完,直接将p2剩下的放在后面
        while(p2<=R){
            help[i++] = arr[p2++];
        }
        for (int j = 0; j < help.length; j++) {
            arr[L+j] = help[j]; //将排序好的数组覆盖到原来的无序数组
        }

补:大雪菜
思路:
1)确定分界点:中间点 mid=(L+R)/2
2)递归排序左右两半
3)归并:合二为一
import java.util.*;
import java.io.*;

public class Main{
    
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(in.readLine());
        int[] arr = new int[n];
        String[] strs = in.readLine().split(" ");
        for(int i =0;i<n;i++){
            arr[i] = Integer.parseInt(strs[i]);
        }
        
        merge_sort(arr,0,n-1);
        
        for(int i=0;i<n;i++){System.out.print(arr[i]+" ");}
    }
    
    public static void merge_sort(int[] arr, int L,int R){
        if(L>=R) return;
        
        int mid =L + ((R- L) >> 1);
        merge_sort(arr,L,mid);
        merge_sort(arr,mid+1,R);
        
        int k=0;
        int i = L;
        int j = mid+1;
        int[] help = new int[R-L+1];
        while(i<=mid && j<=R){
            if(arr[i]<=arr[j]) help[k++] = arr[i++];
            else help[k++] = arr[j++];
        }
        while(i<=mid){ help[k++] = arr[i++];}//右半已经循环完
        while(j<=R){ help[k++] = arr[j++]; }//左半已经循环完
        
        for (i = L, j = 0; i <= R; i++, j++)
            arr[i] = help[j];//j=将排序好的数组覆盖到原来的无序数组
    }
}

5、QuickSort 快速排序(1荷兰国旗)

1)原理

1、给定长度的序列进行操作,从L到R
2、给定数字num,比num小的放在num左边,等于放在中间,大的放在右边

2)手写思路

3)代码

 public static  int[] netherLandsFlag(int[] arr,int L,int R,int num){
        //对给定长度的序列进行操作,从L到R,给定数字num,比num小的放在num左边,等于num放中间,大的放在右边
        int less = L-1; //小于num区域指向L-1,每多一个则less右移
        int more = R+1; // 大于num区域指向R+1,每多一个则more左移
        int cur = L; // 当前指针
        while(cur < more){ //如果当前指针和more相撞 表示完成
            if(arr[cur] < num){ //小于num 放在小于区域(当前数和less指向的数做交换,从less+1开始
                swap(arr,++less,cur++); // less先+1,然后cur和其交换,然后cur右移,继续判断下一个
                                         // 因为小于区域和中间紧挨着(cur是从L开始),所以交换过来的数要不=num,要不是其本身
                                         // 故交换来的数大小已知,无需判断,所以cur直接右移
            }else if(arr[cur] > num){ //大于num,放在大于区域即数组最右边
                                      // more先-1,然后和cur交换,把交换过来的数判断是否大于小于等于num
                                      // 因为大区域和中间属于待定区,这些数的大小未知,所以需要判断,即cur不移动
                swap(arr,--more,cur);
            }else{//如果遇到=num,则不用动,继续判断下一个
                cur++;
            }
        }
        return new int[] {less+1,more-1}; //返回等于num数集的起始位置,即知道小于区域、等于区域、大于区域的位置
    }

6、QuickSort 快速排序(2)

1)原理

1、借鉴上面荷兰国旗的思想,只是把荷兰国旗当中给定的数num变为数组中的数,在快排中一般num设定为当前序列的最后一个数
2、比荷兰国旗多一步:每一轮放置好后,应该再把选定的数即num放在该放的位置(按照顺序放在数组中)

2)手写思路

3)代码

public static void quickSort(int[] arr){
        if(arr == null || arr.length<2){
            return;
        }
        quickSort(arr,0,arr.length-1);
    }

    public static void quickSort(int[] arr,int L ,int R){
        if(L<R){
            //swap(arr,L+(int)(Math.random()*(R-L+1)),R);
            // 加上它即为随机快排:从L到R上任选一个数和R位置的数交换,
            // 也就是说R位置上的数是随机的。但后续过程还是和R位置上的数进行比较,也就是说随机选了个数作划分
            int[] p = partition(arr,L,R);//P[0]:等于区域第一个,p[1]:等于区域最后一个
            quickSort(arr,L,p[0]-1);//小于区域排序
            quickSort(arr,p[1]+1,R);//大于区域排序
        }
    }
    public static int[] partition(int[] arr,int L, int R){
        int less = L-1;
        int more = R;//此时是从最后一个数开始,不是R-1
        int cur = L;
        while(cur < more){
            if(arr[cur]<arr[R]){
                swap(arr,++less,cur++);
            }else if(arr[cur]> arr[R]){
                swap(arr,--more,cur);
            }else{
                cur++;
            }
        }
        swap(arr,more,R); //此轮划分完大中小区域后,将选定的数(最后一个)和大于区域第一个数作交换
        // 因为每次和选定的数(最后一个)作比较,大于它的放在大于区域,那么划分完后的大于区域第一个数必定大于选定的数
        // 把他俩交换,即把一开始选定的数放到正确的位置(等于区域最后一个)
        //printArray(arr);
        return new int[]{less+1,more};//返回等于区域的开始位置less+1,以及结束位置more,此时的more即为交换来的R



    }

补充—高效简洁版本(分治):

思路:双指针,

i、j 轮流向中间走去。i从左到右走,当遇到>=num的数停下来;j开始向内走,当遇到<=num的数,停下来;交换i和j指向的数;循环执行…
在这里插入图片描述

过程:

1、随意找其中一个数num作为分界点:一般为数组左、中、右,即arr[L]、arr[(L+R)/2]、arr[R]
2、重新划分区间:将数组中<=num的放在num左边,>=num的放在num右边
3、递归处理左右两端

代码:

import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(input.readLine());
        int[] arr = new int[n];
        
        String[] strs = input.readLine().split(" ");
        //input.readLine()把一行的数据当成一个字符串,然后.split(" ")把字符串按照空格分成小的字符串数组
        for(int i=0;i<n;i++){arr[i]=Integer.parseInt(strs[i]);}
        
        quickSort(arr,0,n-1);
        
        for(int i=0;i<n;i++){System.out.print(arr[i]+ " ");}
    }
    

    public static void quickSort(int[] arr, int L, int R){
        if(L>=R) return;//边界,只有一个数或没有数
        
        int compare = arr[L];//假设指定的数,可以是arr[R]\arr[L+R>>1]\任意
        int i=L-1;//i前面的数都比compare要小,因为后面先执行i++,所以开始位于边界外
        int j=R+1;//j后面的数都比compare要大
        
        while(i<j){
        //这个i<j每次循环只判断一次,而不是说,里面的循环体执行着执行着遇到i>=j就不执行了,而是等他执行完下一次不进行循环了
            while(arr[++i]<compare);//先执行i++,再比较;i遇到>compare的才停下来
            while(arr[--j]>compare);//先执行j--,再比较;j遇到<compare的才停下来
            if(i<j){//如果两指针还没有相遇,则交换两指针的数
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
        quickSort(arr,L,j);//左半边排序
        quickSort(arr,j+1,R);//右半边排序
    }
}

7、HeapSort 堆排序(待更新)

1)原理

将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;

c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序

数组和二叉树的关系

在这里插入图片描述

2)代码

 public static void heapSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }

        //让整个数组变为大根堆
        for (int i = 0; i < arr.length; i++) {
            heapInsert(arr, i);
            // 依次扩大堆的大小,从0扩到len,即0~i 之间形成大根堆
        }
        //上述排成大根堆后 说明堆顶的位置是最大值,即数组最大元素位于索引=0处(第一个)

        int size = arr.length;//此时堆的大小即为数组的大小
        swap(arr, 0, --size);//把堆顶(数组最大值)放到堆的最后位置,然后堆的大小-1
        while (size > 0) {
            heapify(arr, 0, size);//把上面缩小的堆重新调成大根堆
            swap(arr, 0, --size);//把此时的堆顶放在当前堆的最后位置,然后堆大小-1
        }
    }

    //让数组变为大根堆————往上比
    public static void heapInsert(int[] arr, int index) {
        while (arr[index] > arr[(index - 1) / 2]) {//大于父节点值
            swap(arr, index, (index - 1) / 2);
            index = (index - 1) / 2;
        }
    }

    //发生改变的数组重新调为大根堆————往下沉
    public static void heapify(int[] arr, int index, int size) {
        int left = index * 2 + 1;//左孩子
        while (left < size) {
            int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;
            //left+1相当于右孩子,右孩子不出界的情况下,找到左孩子和右孩子较大的那一个,返回其索引
            largest = arr[largest] > arr[index] ? largest : index;
            //上面找到的较大的左/右孩子,将其和它的父节点比较大小
            if (largest == index) {
                break;//父节点值是最大的,即大于左右节点
            }
            swap(arr, largest, index);
            //否则交换父节点和更大的那个子节点
            index = largest;
            left = index * 2 + 1;
        }
    }

8、桶排序(例:MaxGap)(待更新)

1)原理

2)代码

//找到每个非空和前一个非空桶之间的最大差值
    public static int maxGap(int[] arr){
        if(arr == null || arr.length<2){
            return 0;
        }
        int len = arr.length;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;

        for (int i = 0; i < len; i++) {
            min = Math.min(min,arr[i]);
            max = Math.max(max,arr[i]);
        }
        if(min == max){//说明数组里的数都是同一个数
            return 0; }
        //桶里只记录 1、最小值 2、最大值 3、当前桶里是否有数
        boolean[] hasNum = new boolean[len+1];
        int[] mins = new int[len+1];
        int[] maxs = new int[len+1];
        int bid = 0;//桶的编号,从0开始

        //把数组的数依次放入对应的桶里
        for (int i = 0; i < len; i++) {
            bid = bucket(arr[i],len,min,max);
            //更新桶的最小值与最大值
            mins[bid] = hasNum[bid] ? Math.min(mins[bid],arr[i]) : arr[i];
            maxs[bid] = hasNum[bid] ? Math.max(maxs[bid],arr[i]) : arr[i];
            hasNum[bid] = true;//此时,桶内进数了 状态变为true
        }

        int res = 0; //记录最大差值
        int lastMax = maxs[0]; // 初始化前桶的最大值
        int i = 1;
        for ( ;  i<= len ; i++) { // 从i=1 开始的桶计算与前筒的差值
            if(hasNum[i]){//如果是空的直接跳过
                res = Math.max(res,mins[i] - lastMax);
                //后非空桶的最小值减去前非空桶最大值(数组相邻两数的差值),赋给res
                lastMax = maxs[i];//桶向后移动
            }
        }
        return res;
    }

    // 数num应该入几号桶
    public static int bucket(long num, long len ,long min, long max){
        // 防止(num-min)*len 溢出  转为long型
        return (int)((num-min)*len/(max-min));
    }

表格总结复杂度

在这里插入图片描述

SIMetrix教程-001.SIMetrix软件简介与安装   由于某些原因需要用到SIMetrix仿真软件,然而网上的资料并不是特别多,故在此记录一下这款仿真软件的学习过程,也给有需要的人提供一些参考,免走弯路。如果使用过Pspice或者LTspice软件,学习SIMetrix会很容易入门,仿真软件都是大同小异的,会一样后都可以快速入门其他软件。   SIMetrix是一款以SPICE模型为基础的仿真软件,集成了SIMetrix和SIMPLIS两款内核,为工程师提供了可靠的、易于使用的、并完美结合了速度与精度的电路仿真方式。官方的话不多说,和LTspice一样,优 阅读详情

相关推荐

DiffusionDrive实战:如何用截断扩散模型3个月搞定自动驾驶轨迹规划(附代码)

本文详细介绍了如何利用DiffusionDrive截断扩散模型,在三个月内快速构建端到端的自动驾驶轨迹预测系统。内容涵盖从环境搭建、数据处理、模型架构解析到训练调参和推理优化的完整实战流程,并提供了关键代码示例,旨在帮助开发者高效实现高质量的自动驾驶轨迹规划。

weixin_35578748的博客 147

学会这份算法宝典,随便暴打头条面试官

年底了,各个公司的动静不小,都在储备来年的人才,绝对是程序员的面试黄金时间了,想换工作的人一大把,所以今天想再说说算法。 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门砖。毕竟掌握算法,代码水平一定错不了,还能更快的掌握新技术的核心要领,大厂技术更新更快,需要的就是能快速适应的人才。年薪几十万,是留给有准备的人。 那么咱们普通人,如何快速得掌握面试大厂的算法基础呢? 话不多说,直接先上图 经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的..

tutouchengxuyua的博客 113

拯救者R7000P(2021)装双系统Ubuntu20.04 解决联发科MT7921无线网卡在Ubuntu中不能联网

拯救者R7000P(2021)装双系统Ubuntu20.04/Ubuntu18.04 电脑配置:联想拯救者R7000P CPU:AMD R7-5800H GPU:RTX3060-6G 内存:16GB 固态:500G(原装)+500(加装) 1.做系统盘(本文以Ubuntu20.04为例) 1.下载Ubuntu20.04镜像 直接去Ubuntu官网或者一些国内的镜像去下载都可以,这里给出一个网址https://ubuntu.com/download/desktop,根据需要下载自己学要的Ubuntu版本,后缀

qq_41108639的博客 1万+

腾讯大牛发布《数据结构与算法》笔记,竟然还是带源码的

话不多说,直接先上图 经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以排序和各种的基本数据结构开始入门。我花了一个星期将八大基础排序和链表/二叉树/栈/..

文章中资料均可获取,有需要请添加yunduoa2019即可 133

在Qt中使用EtherCAT-SOEM的初始化中,状态机卡在PreOp->Save-Op过程中,出现State=0x12, Error=0x001e错误的解决办法

1.在调试EtherCAT软件过程中,一直出现配置从站进不了Save_op状态,通过下函数检查从站状态: //使用的从站编号为1 只有1个从站 ec_slave[1].state = EC_STATE_SAFE_OP; ec_writestate(1); //设置到安全模式 ec_statecheck(1, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); printf("Slave %d State=0x%2.2x StatusCode=0x%4

zeal_for_rov的博客 6828

【AutoSAR】【EcuM】ECU状态管理

目录 一、EcuM架构位置 ​二、EcuM功能介绍 三、EcuM状态机 1.STARTUP阶段 2、UP状态 3、shutdown状态 4、休眠状态 5、OFF状态 一、EcuM架构位置 EcuM模块位于系统服务层,如下图红色方框里; 二、EcuM功能介绍 EcuM本身它管理着ECU在STARTUP, RUN,OFF,SLEEP,WAKEUP状态之间的相互切换。 责所有BSW的初始化以及去初始化 和ComM协作来管理网络状态,在需要时关闭ECU 管理所有的唤醒事件,并且在需要时

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3355

太厉害了!终于有腾讯T4大牛把《数据结构与算法》讲的明明白白

话不多说,直接先上图 经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以排序和各种的基本数据结构开始入门。我花了一个星期将八大基础排序和链表/二叉树/栈/..

weixin_50666791的博客 197

【100%通过率】华为OD机试真题 Python 实现【打印机队列】【2022.11 Q4 新题】

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。

MISAYAONE的博客 1万+

第一次见腾讯T3-2的大牛把《数据结构与算法》讲解的这么详细,附带源码笔记,太值了~

话不多说,直接先上图 经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以排序和各种的基本数据结构开始入门。我花了一个星期将八大基础排序和链表/二叉树/栈/队列制.

+W❤:bjmsb2019 333

DeepCAD: 使用深度自监督学习技术在Python中进行钙成像去噪的全面指南

钙成像是一种用于观察神经活动的技术,通过检测细胞内钙离子的变化来推断神经元的活动。由于其高时空分辨率和对活体组织的适应性,钙成像已经成为神经科学研究中的重要工具。然而,钙成像数据往往伴随着各种噪声,这些噪声可能来自于设备、生物样本或环境。为了获得准确的神经活动信息,去噪是非常关键的。深度自监督学习是一种使用未标记数据进行训练的机器学习方法。与传统的监督学习不同,它不需要大量的标记数据,而是通过学习数据的内部结构和模式来提取有用的特征。DeepCAD是一个基于深度自监督学习的钙成像去噪工具。

qq_38334677的博客 758

Lasso的原理及其与其他特征选择方法的比较进行阐述,然后讨论Lasso优点、缺点以及应用场景,最后给出了代码实例

在机器学习领域中,特征选择(feature selection)是指在模型训练前对数据集进行分析,选择其中有助于预测目标变量或影响模型性能的特征,去除不相关或冗余的特征,提升模型的泛化能力。而Lasso回归是一种很流行的用于特征选择的方法之一。Lasso回归(又称LASSO,least absolute shrinkage and selection operator)是一种线性模型中的特征选择方法。

AI天才研究院 3051

CC数据结构排序算法资源集:助您轻松掌握八大排序算法

CC数据结构排序算法资源集:助您轻松掌握八大排序算法 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代计算机科学中,排序算法是数据结构学习的基础,更是程序设计不可或缺的一部分。今天,我们要为您推荐的是一个专门针对C/C++语言开发的资源集——CC数据结构排序算法资源集。这个项目集合了八大经典排序算法,旨在帮助开发者和学习者快速掌握这些算法的实现和应用。 项目技术分...

gitblog_06734的博客 335

OpenClaw 自定义 Skill 开发完整指南(最新版)

OpenClaw 中的每个 Skill,本质是一套“能力描述 + 执行逻辑”的组合包,核心特征如下:核心载体:以文件夹为单位,文件夹内必须包含SKILL.md文件(能力描述核心);扩展文件:可选agent.py(Python 执行逻辑)、index.ts(TypeScript 执行逻辑)、(辅助文档/示例资源)等;核心优势:AI 通过阅读 SKILL.md 的自然语言描述理解技能,无需严格遵循代码接口,灵活度极高;

haolove527的专栏 2万+

从此不再无序:八大排序算法总结(附Java、C源码)

前言 大家好!今天小编整理一下面试官常考的一大热点题型:“排序”。下面的文章将重点的几大排序做了解析,我们从冒泡、选择、插入、归并、快速、堆、计数和基数这八大经典的排序算法讲起,比如:希尔排序,在插入排序的基础上做了优化,本文就不在讲解,博客网站上有很多文章!!! 大部分公司都会注重查找和排序算法。应聘者可以在了解各种查找和排序算法的基础上,重点掌握二分查找、归并排序和快速排序。 还要对各种排序算法的时间、空间复杂度烂熟于心,了解它的优缺点。 我参考的文章有:十大经典排序算法总结(Java实现+动画)

x0919的博客 746

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

八大排序算法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33850015的博客 73

VC中sqlite的使用

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

【附源码笔记免费领取】终于有人把《数据结构与算法》带源码笔记给整理全了!!太牛了!

随着科学技术的发展,人工智能已经逐渐渗透到各个行业,这是一个相当有前景的专业领域。 其中,算法工程师这一职位更是非常火爆,在急缺大量人才的同时,也吸引了众多求职者,那么,初学者该如何学好算法呢? 这里我粗略的整理了一份比较好的资源分享给大家用于辅助学习,帮助大家更好的学好算法。 话不多说,直接先上图 如果你关注招聘试题,就会发现越是大公司,问的问题越基础,有的甚至问你什么是栈和队列,反而一些小公司会关心你做过什么系统,关注点不同。 大公司更注...

xuanwo007的博客 317

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

最新python相关的面试题(测试开发方向)

2019年夏天,我从北京来到了成都,工作并不好找,面试了两个月,干货都在这里了。 必考面试题 ????如何去除列表中的重复元素 ????八大排序算法合集 ????斐波那契数列的python实现 ????如何对字符串进行反转 如何对单词反转 统计字符串中每个字母出现的次数 对某英文文章的单词,进行词数统计 python的字典合并 python的赋值、浅拷贝和深拷贝的区别 ????返回字符串中第一个不重复的字母和位置 经常会问...

1266

八大排序算法详解:原理、复杂度与实战选型

排序算法是数据结构与算法学习中的核心基础,它不仅是考试和面试的常客,更直接关系到业务系统中数据组织与查询的效率。排序的本质是将无序序列按关键字重新排列,其背后涉及时间复杂度、空间复杂度与稳定性等关键概念。理解这些原理,有助于开发者在面对海量数据时做出正确的技术选型。常见的排序算法包括插入排序、快速排序、归并排序、堆排序等,各自适用于不同场景:快速排序适合随机大数据集,归并排序适合对稳定性有要求的场景,堆排序则擅长Top K问题。本文整理了8种常见排序算法的原理、代码实现与调试经验,帮助读者从基础到实战全面掌

weixin_29305337的博客 233

Java学习教程!java编程基础实验指导书金陵科技学院

前言 最近一个读者和我反馈,他坚持刷题2个月,终于去了他梦寐以求的大厂,薪资涨幅非常可观,期间面字节跳动还遇到了原题… 因为据我所知很多大厂技术面试的要求是:技术要好,计算机基础扎实,熟练掌握算法和数据结构,语言不重要,熟练度很重要。每一轮技术面试都可能考代码,不只考算法,但一定会考算法。 那你知道为什么要考算法么?其实核心是看候选人是不是足够聪明。考算法一般会分两步,第一步是直接让你说思路,第二步是让你直接上手写代码。很多大厂的算法题一般对应的是 LeetCode 中级模式,要通过面试,你肯定得花时间好好

m0_56604931的博客 174

八大排序算法稳定性分析,原来稳定性是这个意思...

点击上方蓝字“轮子工厂”关注公号 后台回复“我要造轮子”获取100本经典图书稳定性定义:排序前后两个相等的数相对位置不变,则算法稳定。稳定性得好处:从一个键上排序,然后...

tanqingbo的博客 1854

八大排序算法详解:从原理到优化的数据结构必修课

数据结构学习中,排序算法是理解算法设计思想的核心样本。通过分治、递归、双指针与空间换时间等策略,排序算法不仅解决数据有序化问题,更揭示了比较排序与非比较排序的本质差异。快速排序与归并排序作为分治思想的代表,其时间复杂度与稳定性分析是面试与工程实践的高频考点;而计数排序则展示了线性时间的可能性。在实际应用中,排序算法被广泛用于数据库查询、外部排序、并行计算与搜索引擎优化等场景,理解底层原理有助于根据数据特征选择最优策略。本文从算法分类出发,系统剖析8种常用排序的设计思路、代码实现、优化技巧与实战应用,帮助读者

weixin_33393017的博客 294

网瘾室友用一个月的时间,面试进入了网易,他是怎么做到的?

offer 背景 学历:211研究生 专业:软件工程专业 简单情况:学校的课程大致学了一部分,喜欢玩游戏,基本晚上和周末都在打lol 面试准备 复习 室友用一个月的时间来进行复习,大概有408,算法,项目 1.每天都会刷2~3到算法题(leetcode) 2.数据结构、计算机组成原理、计算机网络、操作系统,每个星期复习一门 3.C++每天都需要带着看一下 4.牛客网看面经,补充自己的不足,面经刷了大概50篇 简历 一份好的简历可以让你从简历海中脱颖而出,那么如何是一份好的简历呢 简历模板:超级简历

程序员小R的博客 3291

校招必看:八大排序算法原理、复杂度与高频面试题

本文系统介绍了八大经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序和计数排序。每种算法从思想原理、动图演示、代码实现到复杂度分析进行详细讲解,并比较了不同排序算法的适用场景和性能特点。文章强调没有一种排序算法在所有情况下最优,需要根据数据规模、内存限制和稳定性要求选择合适的算法。通过本文,读者可以全面掌握排序算法的核心知识,为算法设计和性能优化打下坚实基础。

分享 AI 时代程序员的进阶之路:大模型应用、AI 编程工具实战,同时沉淀 C / Linux 底层技术笔记。与君共赴,万里征途。 790

互联网大厂笔试面试必考10大排序算法:选择、冒泡、插入、归并、快速、堆、计数、基数

8排序大算法中,每一个算法,核心思想你都要理解透, 而且,必须闭眼睛也能手撕出来这些排序算法的代码!!!

weixin_46838716的博客 1412

一个两年Java工程师的面试总结

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱Java互联网工程师面试1000题。

F1520080的博客 1059

浅谈排序算法分析-推荐博文

排序算法属于经典基础算法基本功!!! 参考一:《十大经典排序算法最强总结》 https://mp.weixin.qq.com/s/HFW5uCXMSyz_7KRNwlabrg 该博文首先对排序算法进行了简单的说明,其次从排序算法的定义、描述、动态演示、代码实现(Java代码)、算法分析介绍了十大经典排序算法,然后对十大算法进行了总结,如下图所示: 参考二:《快速排序到底有多快?(含代码分析、9大排序算法并行运行对比视频)》 https://mp.weixin.qq.com/...

荆楚小胡的博客 206
上一篇: 【避坑】nn.ConvTranspose2d()后的尺寸问题
下一篇: 【求职·算法基础】十大必备算法
金石zzz
博客等级 码龄8年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值