[万人前提计划]《算法零基础100讲》(第37讲) 排序进阶 - 快速排序——习题(C语言)(超简单易懂)φ(゜▽゜*)♪

[万人前提计划]《算法零基础100讲》(第37讲) 排序进阶 - 快速排序——习题(C语言)(超简单易懂)φ(゜▽゜*)♪,第1张

[万人前提计划]《算法零基础100讲》(第37讲) 排序进阶 - 快速排序——习题(C语言)(超简单易懂)φ(゜▽゜*)♪ 文章目录

目录

文章目录

零、写在前面

一、最小时间差

二、有序数组的平方

三、优势洗牌   (不会,以后二刷的时候填上)

四、救生艇


零、写在前面

真的是难啊  QAQ    QAQ

本章知识回顾:这一章主要描述了快速排序的方法

动图建议手机录下来然后0.5倍速暂停着看(有动图)

《算法零基础100讲》(第37讲) 排序进阶 - 快速排序_英雄哪里出来-CSDN博客快速排序,真的够快吗?https://blog.csdn.net/WhereIsHeroFrom/article/details/121551692每天会开启一篇试读文章,每日坚持打卡就可以一直白嫖哦

void Swap(int *a, int *b) {// 交换两个数的位置
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int Partition(int a[], int l, int r){  //
    int i, j, pivox; 
    int idx = l + rand() % (r - l + 1); // 随机取基准数下标,rand()函数生成随机数对数组长度 
                                                                    //求余
    pivox = a[idx];                     // 基准数
    Swap(&a[l], &a[idx]);               //把基准数换到第一个位置
    i = j = l + 1;                      //初始化下标,准备开始遍历 
    while( i <= r ) {                       //遍历到最右端 
        if(a[i] < pivox) {     //当++i之后再进入循环时候,i和j交换就是了两个不同数交换了  
            Swap(&a[i], &a[j]);   //就是a[i]遍历时候先大于pivox,再小于pivox的时候               
            ++j;                   //就会把大的数换到数组后边      
        }
        ++i;                                // 
    }
    Swap(&a[l], &a[j-1]);                   // 把a[l]换到第一个大于pivox的数前面
    return j-1; //返回以已经确认的这个基准数的位置//这样就保证了前边数小于pivox后边数大于pivox
}


//递归进行划分
void QuickSort(int a[], int l, int r){
    if(l < r){
        int mid = Partition(a, l, r);  //递归分段
        QuickSort(a, l, mid-1);
        QuickSort(a, mid+1, r);
    }
}

一、最小时间差

1.题目

给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

示例 1:

输入:timePoints = ["23:59","00:00"]
输出:1

力扣https://leetcode-cn.com/problems/minimum-time-difference/

2.题解

思路;排序,相邻的相减,第一个和最后一个再减一下,找最小的

void swap(int*a,int*b){
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
int Partition(int a[],int l,int r){
    int i,j,pivox;
    int idx=l+rand()%(r-l+1);
    pivox=a[idx];
    swap(&a[l],&a[idx]);
    i=j=l+1;
    while(i<=r){
        if(a[i]sum?sum:ans;
    }
    if(nums[0]+1440-nums[timePointsSize-1]

3.结果

二、有序数组的平方

1.题目

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

 

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

力扣https://leetcode-cn.com/problems/squares-of-a-sorted-array/

2.题解

思路:平方后存在数组里,然后一个快速排序

void swap(int*a,int*b){
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
int Partition(int a[],int l,int r){
        int i,j,pivox;
        int idx=l+rand()%(r-l+1);
        pivox=a[idx];
        i=j=l+1;
        swap(&a[l],&a[idx]);
        while(i<=r){
            if(a[i] 

3.结果

三、优势洗牌   (不会,以后二刷的时候填上)

1.题目

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。

返回 A 的任意排列,使其相对于 B 的优势最大化。

 示例 1:

输入:A = [2,7,11,15], B = [1,10,4,11]
输出:[2,11,7,15]

力扣https://leetcode-cn.com/problems/advantage-shuffle/2.解题

3.结果

四、救生艇

1.题目

第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回载到每一个人所需的最小船数。(保证每个人都能被船载)。

 

示例 1:

输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)

力扣https://leetcode-cn.com/problems/boats-to-save-people/

2.题解

思路:先排序,然后头尾双指针 ,先看尾,能和头一船,ans++,然后头++(并标记已经上船了),尾--     不能一船,ans++,尾--,头不变  一直到头大于尾

void swap(int*a,int*b){
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
int Partition(int a[],int l,int r){
        int i,j,pivox;
        int idx=l+rand()%(r-l+1);
        pivox=a[idx];
        i=j=l+1;
        swap(&a[l],&a[idx]);
        while(i<=r){
            if(a[i] 

3.结果

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5634900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存