[解题报告]《算法零基础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;
}


相关文章
|
4天前
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
8 2
|
4天前
|
算法
常见的算法排序(2)
常见的算法排序(2)
12 3
|
4天前
|
算法 搜索推荐 索引
数据结构与算法 排序(下)
数据结构与算法 排序(下)
13 1
|
4天前
|
缓存 算法 搜索推荐
数据结构与算法 排序(上)
数据结构与算法 排序(上)
11 0
|
4天前
|
算法 调度
【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究
【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究
|
4天前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
11 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
19 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
2天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
4天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。