[解题报告]《算法零基础100讲》(第34讲) 排序入门 - 选择排序

简介: [解题报告]《算法零基础100讲》(第34讲) 排序入门 - 选择排序

目录


零、写在前面


一、主要知识点


       1.选择排序


二、课后习题


611. 有效三角形的个数


769. 最多能完成排序的块


写在最后


零、写在前面

       今天是打卡的第34天,今天的难度还行,赶紧写写复习考试了-.-知识点在:


《算法零基础100讲》(第34讲) 排序入门 - 选择排序

https://blog.csdn.net/WhereIsHeroFrom/article/details/121484862


一、主要知识点

       1.选择排序

每次选择一个最小的元素与当前位置元素交换,保证前半部分有序。


void SelectionSort(int n, Type *a) { 
    int i, j;
    for(i = 0; i < n - 1; ++i) {  
        int min = i;               //记录最小值位置 
        for(j = i+1; j < n; ++j) {  
            if(a[j] < a[min]) {
                min = j;        
            }
        }
        Swap(&a[i], &a[min]);   
    }
}

二、课后习题

611. 有效三角形的个数

611. 有效三角形的个数

https://leetcode-cn.com/problems/valid-triangle-number/


题目描述


给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。


思路


先进行排序,针对每一个值只需要保证最小值加次小值 > 最大值 就可以形成一个三角形了。


其中根据次小值找最大值可以使用最大值的指针,可以避免回溯。


void swap(int *a,int *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
void selectsort(int *nums,int numsSize){//插入排序 就是用用-.-
    for(int i = 0;i < numsSize - 1;i++){
        int min = nums[i],mini = i;
        for(int j = i + 1;j < numsSize;j++)
            if(nums[j] < min) min = nums[j],mini = j;
        if(mini != i)   swap(&nums[i],&nums[mini]);
    }
}
int triangleNumber(int* nums, int numsSize){
    int ans = 0;
    selectsort(nums,numsSize);
    for(int i = 0;i < numsSize - 2;i++){//最小值
        int k = i;            //最大值
        for (int j = i + 1; j < numsSize; ++j) {//次小值
            while (k + 1 < numsSize && nums[k + 1] < nums[i] + nums[j]) {
                ++k;
            }
            ans += fmax(k - j, 0);    //防止K < j 情况
        }
    }
    return ans;
}

769. 最多能完成排序的块

769. 最多能完成排序的块

https://leetcode-cn.com/problems/max-chunks-to-make-sorted/


题目描述


数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。


我们最多能将数组分成多少块?


思路


由于包含的元素是确定的就是0-arr.length -1。


本来需要保证的是后面元素的最小值 大于前面元素的最大值。但是这道题的特殊性。


所以如果前k个元素的最大值为 k-1 表示这个可以进行一个排序分块。


基于这样的思路,代码很容易写出来。


int maxChunksToSorted(int* arr, int arrSize){
    int max = -1,ans = 0;
    for(int i = 0;i < arrSize;i++){
        if(arr[i] > max)    max = arr[i];
        if(max == i) ans++;    //可进行分快点
    }
    return ans;
}
相关文章
|
3月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
192 7
|
3月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
153 8
|
3月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
56 0
|
4月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
56 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
4月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
36 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
4月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
168 0
|
4月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
47 0
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
147 68

热门文章

最新文章