【第一周学习——认识 O(N*logN) 的排序[ 归并排序 、堆排序、快速排序 ]

news2024/11/23 16:40:28

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:《数据结构与算法》
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

在这里插入图片描述

请添加图片描述

目录

  • 一、前言
  • 二、归并排序
  • 三、堆排序
    • 随堂习题-给气球分类题目【荷兰国旗问题】
  • 四、快速排序

一、前言

  • 欢迎报名字节跳动 青训营 线上免费参加 详情请看链接点此查看详情

  • 上一章回顾:第一周练习——认识复杂度和简单排序算法

二、归并排序

在这里插入图片描述

给你一个n代表有n个数字,给出这n个数字,然后你需要使用归并排序将这些数字从小到大排好。

输入描述:

第一行输入一个n,代表有n个数字
第二行输入n个数

输出描述:

输出排序好后的n个数


示例1
输入:

4
4 3 2 1

输出:

1 2 3 4

代码

#include<bits/stdc++.h>
using namespace std;
void sort(vector<int> &nums,int l,int r){
    if(l>=r) return;
    long mid=l+((r-l)>>1);
    //递归左右
    sort(nums,l,mid);
    sort(nums,mid+1,r);
    //合并
    //创建辅助数组
    vector<int> help(r-l+1);
    int i=0;//辅助数组的下标
    int p1=l;//左边的下标
    int p2=mid+1;//右边的下标
    while(p1<=mid && p2<=r){
        help[i++]= nums[p1] <= nums[p2] ? nums[p1++] : nums[p2++];
    }
    while(p1<=mid){
         help[i++]=nums[p1++];
    }
    while(p2<=r){
        help[i++]=nums[p2++];
    }
    //合并到原来的数组
    for(int i=0;i<r-l+1;i++){//这里注意别越界
        nums[l+i]=help[i];
    }
}

int main(){
    int n=0;
    cin>>n;
    if(n<=0)return 0;
    vector<int>nums(n);
    for(int i=0;i<n;i++){
        cin>>nums[i];
    }
    
    sort(nums,0,n-1);
    
    for(int i=0;i<n;i++){
       cout<<nums[i]<<" ";
    }
    return 0;
}

三、堆排序

什么是堆?

堆(Heap)是计算机科学中一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树数组 对象。

问题?

给你一个n代表有n个数字,给出这n个数字,然后你需要使用归并排序将这些数字从小到大排好。

输入描述:

第一行输入一个n,代表有n个数字
第二行输入n个数

输出描述:

输出排序好后的n个数


示例1
输入:

4
4 3 2 1

输出:

1 2 3 4

代码

#include <bits/stdc++.h>
using namespace std;

void heapSort(vector<int> &v){
    //大根堆,小根堆,大根堆排升序,小根堆排降序
    int size = v.size();
    while(size > 0){
        int i = size / 2 -1; //从二叉树的最后非叶子结点开始
        //遍历非叶子节点
        for(;i>=0;i--){
            int mx = v[i]; //取当前根节点为默认的最大值
            if(i*2+2<size){//存在右节点
                if(v[i*2+1] < v[i*2+2])
                    swap(v[i*2+1] , v[i*2+2]);//把较大值换到左节点
            }
            if(mx < v[i*2+1]) swap(v[i*2+1] , v[i]);
        }
        size--;
        swap(v[0],v[size]);
    }
}

int main(){
    int n;
    cin>>n;
    vector<int> v(n,0);
    for(int i = 0;i<n;i++) cin>>v[i];
    heapSort(v);
    for(auto i:v) cout<<i<<" ";
    return 0;
}

随堂习题-给气球分类题目【荷兰国旗问题】

牛牛今天带来了一排气球,气球有n个,然后每一个气球里面都包含一个数字,牛牛是一个善于思考的人,于是他就想到了一个问题,
牛牛随便给你一个值K,这个值在这些气球中不一定存在,聪明的你需要把气球中包含的数字是小于K的放到这排气球的左边,大于K的放到气球的右边,
等于K的放到这排气球的中间,最终返回一个整数数组,其中只有两个值,分别是气球中包含的数字等于K的部分的左右两个下标值,如果气球中没有K这个数字就输出-1,-1。

输入描述:

第一行的输入为n和K,n代表有多少个气球,K代表牛牛选的数
第二行需要输入n个大小的数组a,a[i]代表每个气球中放的数字,
其中1 <=N,K<=1000,1<=a[i]<=1000。

输出描述:

一行,输出返回数组中的那两个值。


示例1
输入:

10 3
1 4 0 0 3 1 5 3 1 1

输出:

6 7

说明:

气球按照题意处理后变成下面的样子
1 1 0 0 1 1 3 3 5 4
你会看出3 3的位置一个在6 一个在7

#include <iostream>

using namespace std;

int partation(int L,int R,int n,int a[n],int k)
{
    int less = L - 1;//左边界
    int more = R + 1;//右边界
    int index = L;//下标
    
    while(index < more){
        if(a[index] < k){//小于目标值
            swap(a[index++],a[++less]);//交换左边界的下一个值和当前下标的值 然后下标+1
        }
        else if(a[index] > k){//大于目标值
            swap(a[index],a[--more]);//交换右边界的下一个值和当前下标的值
            //注意这里下标值不需要+1
        }
        else{
            index++;
        }
    }//while循环结束
    
    if(less + 1 > more -1){
        cout << -1 <<" "<< -1; 
    }
    else{
        cout << less+1 <<" "<< more-1;
    }
    return 0;
}
int main(){
    int n,k;
    cin>>n>>k;
    int *a = new int[n];
    for(int i = 0;i<n;i++){
        cin >> a[i];
    }
    int L = 0;
    int R = n - 1;
    partation(L,R,n,a,k);
    return 0;
}

四、快速排序

快速排序原版

在这里插入图片描述

改进 在数组中随机取一个数 和数最后的那个数交换 然后以这个数为划分值 其他过程一样


给你一个n代表有n个数字,然后你需要使用快速排序将这些数字从小到大排好

输入描述:

第一行输入一个n,代表有n个数字
第二行输入n个数中1 <=N,K<=1000,1<=a[i]<=1000。

输出描述:

输出排序好后的n个数


示例1
输入:

4
4 3 2 1

输出:

1 2 3 4

#include <iostream>
using namespace std;

int help[2];
int *partition(int *arr,int L,int R,int* help){
    int less=L-1;
    int more=R;
    while(L<more){
        if(arr[L]<arr[R]){
            swap(arr[++less], arr[L++]);
        }
        else if(arr[L]>arr[R]){
            swap(arr[L], arr[--more]);
        }
        else{
            L++;
        }
}
    swap(arr[more],arr[R]);
    help[0]=less+1;
    help[1]=more;
    return help;
}
void quicksort(int *arr,int L,int R){
    if(L<R){
        int p=rand()%(R-L+1)+L;
        swap(arr[R],arr[p]);
        int *help2=partition(arr,L,R,help);//荷兰国旗问题 划分区间
        quicksort(arr,L,help2[0]-1);
        quicksort(arr,help2[1]+1,R);
    }
}


int main(){
    int n;
    cin>>n;
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    
    quicksort(arr,0,n-1);//快排
    
    for(int i=0;i<n;i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)187. 重复的DNA序列(C++)

哈希表 直观思考&#xff0c;由于限定了答案长度 101010 &#xff0c;只需要一次遍历字符串&#xff0c;统计所有长度为 101010 的子串的出现次数(哈希表) &#xff0c;最后遍历哈希表&#xff0c;维护答案&#xff0c;记录出现 222 次(及以上)的字符串 。 class Solution { …

【BBuf的CUDA笔记】二,解析 OneFlow BatchNorm 相关算子实现

0x1. 前言 在ResNet中&#xff08;https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py&#xff09;&#xff0c;关于BatchNorm的调用一共有两种模式&#xff0c;第一种是ReLU接在BN之后&#xff1a; out self.bn1(out) out self.relu(out)另外一种…

MicFunPred——最新16S rRNA扩增子数据功能预测数据库

近年来&#xff0c;基于扩增子测序进行物种的功能预测是研究微生物群落功能的主要方面&#xff0c;目前最常用的软件包括Tax4Fun以及PICRUSt2。关于这两款软件的使用方法详可参见凌波微课|扩增子研究第十六讲&#xff1a;扩增子测序结果中的物种功能预测。 Tax4Fun使用最近邻匹…

2022年终总结-两年Androider的成长之路

金句分享 生活金句 1.可难道我们生命中做的每一件事不都是为了被爱得更多一点吗 2.这不只是一种对承诺的恐惧&#xff0c;也不是我缺乏关心和爱的能力&#xff0c;因为我做得到&#xff0c;只不过&#xff0c;老老实实讲。我想 我宁愿为了某件我擅长的事&#xff0c;我能表现…

一个select死锁问题

以下代码的输出结果&#xff1a; func main() {var wg sync.WaitGroupfoo : make(chan int)bar : make(chan int)wg.Add(1)go func() {defer wg.Done()select {case foo <- <-bar:default:println("default")}}()wg.Wait() }结果 解析 对于 select 语句&#…

【Linux】进程信号

目录 一、什么是信号 二、信号产生的条件 1、键盘产生 2、进程异常 3、命令产生 4、软件条件 三、信号保存的方式 四、信号处理的方式 1、信号处理接口 2、信号处理时机 3、进程为什么要切换成为用户态才进行信号的捕获方法&#xff1f; 4、sigaction 五、可重入函…

Java+MySQL基于ssm的会议交接平台

随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达,其次就是对任务的安排和执行没有很好的记录,为了改变这些情况,于是我们提…

信贷产品年终总结之贷后逾期分析

自本月月初疫情全面放开后&#xff0c;身边的朋友基本都阳了一遍&#xff0c;希望正在浏览本篇文章的读者您是还没阳过的幸运儿。另外&#xff0c;今天也是冬至了&#xff0c;祝各位读者身边健康&#xff0c;远离羊群&#xff01; 最近我们分享了信贷业务年终总结系列的前2篇文…

Python中转义字符是个啥

文章目录前言一、转义字符是什么&#xff1f;二、常见的转义字符有哪些&#xff1f;总结前言 昨天有粉丝问了我这个代码问题&#xff0c;如下图&#xff1a; 他很好奇代码都没有错误&#xff0c;怎么运行就报错&#xff0c;不知道有咩有小伙伴能看出问题在哪呢&#xff1f; 其…

Cookie 和 Session 的工作流程

文章目录1.Cookie1.什么是Cookie2.Cookie可以干嘛3.Cookie实现登陆逻辑的流程2.session1.session是什么2.session有什么用3.session的工作流程3.Cookie 和 session的区别(重点)1.Cookie 1.什么是Cookie Cookie中存储的是字符串,是浏览器在本地持久化保存数据的一种方案 通过点…

2023春招:Javaweb面试锦囊

cookie 和 session 的区别&#xff1f;&#xff08;必会&#xff09; 存储位置不同 cookie 存放在客户端电脑&#xff0c;是一个磁盘文件。Ie 浏览器是可以从文件夹中找到。session 是存放在服务器内存中的一个对象。 chrome 浏览器进行安全处理&#xff0c;只能通过浏览器找…

圣诞 HTML 代码汇总

文章目录Part.I 音效圣诞树Part.II 圣诞树小球Part.III 简笔圣诞树圣诞节快到了&#xff0c;在网上找了一些 html 代码&#xff0c;觉得挺有意思的&#xff0c;顺带分享一下~ Part.I 音效圣诞树 来源&#xff1a;https://blog.csdn.net/m0_73309780/article/details/128176149…

面临项目失控?四个维度应对项目进度优化【洞见2】

常见的对进度的管理的流程是制定进度目标&#xff0c;WBS工作任务拆解&#xff0c;任务的时间估算&#xff0c;然后执行监督。 有时候这样的过程就会出现的进度延迟&#xff0c;而针对进度的延迟&#xff0c;往往企业多选择是通过加班赶工来完成。 项目进度优化方案 但是如…

【第一章 Linux特点,结构,网路连接模式,Linux目录结构】

第一章 Linux特点&#xff0c;结构&#xff0c;网路连接模式&#xff0c;Linux目录结构 1.操作系统&#xff1a; 用于管理和控制计算机所有软、硬件资源的一组程序。 2. Linux特点总结&#xff1a; ① 开放性&#xff1b; ② 多用户&#xff1b; ③ 多任务&#xff1b; ④ 良好…

喇叭天线设计

电磁喇叭天线是最简单而常用的微波天线。它的主要优点是结构简单&#xff0c;馈电简便&#xff0c;便于控制主面波束宽度和增益&#xff0c;频率特性好且损耗较小。它由波导逐渐张开来形成&#xff0c;其作用是加强方向性&#xff0c;这与声学喇叭的原理相似。若主模TE10的矩形…

python爬虫爬取网页上的图片

目录 一&#xff1a;爬虫基础 二&#xff1a;安装html解析的python工具 三&#xff1a;爬取网页图片 一&#xff1a;爬虫基础 爬虫基本过程&#xff1a; 1.请求标头 headers 2.创建一个会话 requests.Session 3.确定请求的路径 4.根据路径获取网页资源(HTML文件) 5.解析html…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points UG/NX二次…

【java随笔】面向对象思维

1.怎么建立面向对象的思维方式 &#xff08;1&#xff09;先整体&#xff0c;再局部 &#xff08;2&#xff09;先抽象&#xff0c;再具体 &#xff08;3&#xff09;能做什么&#xff0c;再怎么做 2.如何学习面向对象 &#xff08;1&#xff09;语法 &#xff08;2&#xff09…

执行docker restart [CONTAINER ID]命令时会把之前的参数都带上吗

我在搭建rocketmq时候&#xff0c;运行了好几个容器命令也比较长如下&#xff1a; # 启动 namesrv docker run -d -p 9876:9876 -v "D:/Program Files/rocketmq/namesrv/logs:/root/logs" -v "D:/Program Files/rocketmq/namesrv/store:/root/store" …

JAVA手机网站销售

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;