[解题报告]《算法零基础100讲》(第33讲) 排序入门 - 冒泡排序

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

目录


零、写在前面


一、主要知识点


       1.冒泡排序


二、课后习题


75. 颜色分类


4. 寻找两个正序数组的中位数


747. 至少是其他数字两倍的最大数


写在最后


零、写在前面

       今天是打卡的第33天,今天的难度巨低,难道因为大家都要考试了?知识点在:

《算法零基础100讲》(第33讲) 排序入门 - 冒泡排序https://blog.csdn.net/WhereIsHeroFrom/article/details/121463964

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


一、主要知识点

       1.冒泡排序

每次将最大的元素冒到最后,那么最后几个元素就是局部有序的。


需要注意的是交换的时候进行标记,如果一趟冒泡里没有发生任何一次交换,说明已经有序,可以提前退出。


#define Type int
void Swap(Type* a, Type* b) {
    Type tmp = *a;
    *a = *b;
    *b = tmp;
}
void BubbleSort(int n, Type *a) {
    bool swapped;
    int last = n;
    do {
        swapped = false;      
        for(int i = 0; i < last - 1; ++i) { 
            if(a[i] > a[i+1]) {              //冒泡
                Swap(&a[i], &a[i+1]);      
                swapped = true;              // 标记交换
            }
        }
        --last;
    }while (swapped);//无论怎样 最后只剩一个元素的时候一定不会发生交换
} 
void sortColors(int* nums, int numsSize){ 
    BubbleSort(numsSize, nums);
}

二、课后习题

75. 颜色分类

75. 颜色分类

https://leetcode-cn.com/problems/sort-colors/


题目描述


给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。


此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。


思路


花里胡哨,乱七八糟,就是让你排序罢了。。从小到大那种0.0


void swap(int *a,int *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
void sortColors(int* nums, int numsSize){
    for(int i = 0;i < numsSize - 1;i++){
        bool temp = false;   //判断是否有交换
        for(int j = 1;j < numsSize - i;j++)
            if(nums[j] < nums[j - 1])
                swap(&nums[j],&nums[j - 1]),temp = true;
        if(!temp) break;
    }
}

4. 寻找两个正序数组的中位数

4. 寻找两个正序数组的中位数

https://leetcode-cn.com/problems/median-of-two-sorted-arrays/


题目描述


给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。


思路


这个有点二路归并排序的感觉了,但是我们要做的只是找到中间的两个元素罢了。我就直接记住中间两个元素就完事了。你如果问如果是奇数中间只有一个?我就计两遍!


就可以统一结果啦。是不是很机智?


double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int mid1,mid2,ans = 0;
    //记录中间的两个位置在哪里
    if((nums1Size+nums2Size)&1) mid1=mid2= (nums1Size +nums2Size)/2;
    else mid2 = (nums1Size + nums2Size) / 2,mid1 = mid2 - 1;
    int low = 0,high = 0,count = 0;//双指针归并排序
    while(count < nums1Size + nums2Size){
        int temp;
        //归并计算下个元素
        if((high != nums2Size)&&(low != nums1Size)){
            if(nums1[low] < nums2[high])    temp = nums1[low++];
            else temp = nums2[high++];
        }
        else if(high != nums2Size) temp = nums2[high++];
        else temp = nums1[low++];
        //到中间位置进行记录
        if(mid1 == count)   ans += temp;
        if(mid2 == count)   {ans += temp;break;}   
        count++;
    }
    return ans/2.0;
}

747. 至少是其他数字两倍的最大数

747. 至少是其他数字两倍的最大数

https://leetcode-cn.com/problems/largest-number-at-least-twice-of-others/


题目描述


给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。


请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。


思路


找到最大值,然后做判断就好了,没啥难度。


int dominantIndex(int* nums, int numsSize){
    if(numsSize == 1)   return 0;
    int max = -1,mini;
    for(int i = 0;i < numsSize;i++)
        if(max < nums[i]) max = nums[i],mini = i;//找到最大值
    for(int i = 0;i < numsSize;i++)
        if(i != mini && max < 2*nums[i]) return -1;
    return mini;
}


相关文章
|
3月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
155 67
|
3月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
192 7
|
3月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
153 8
|
4月前
|
搜索推荐
冒泡排序算法
【10月更文挑战第19天】冒泡排序是一种基础的排序算法,虽然在实际应用中可能不是最优的选择,但对于理解排序算法的基本原理和过程具有重要意义。
|
3月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
56 0
|
4月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
56 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
4月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
168 0
|
4月前
|
搜索推荐 C语言
排序算法--冒泡排序
排序算法--冒泡排序
30 0
|
4月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
47 0
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。

热门文章

最新文章