【C语言督学营 第十八天】考研408排序大题初探(将排序思想融入题目)

文章目录

  • 题目一
    • 分析
    • 代码实战
  • 题目二
    • 分析
    • 代码实战
  • 补充(快排与归并)
  • 数据结构大题注意点!!!(评分标准)

题目一

在这里插入图片描述

分析

(1)算法的基本设计思想
由题意知,将最小的nl2个元素放在Ai中,其余的元素放在A2中,分组结果即可满足题目要求。仿照快速排序的思想,基于枢轴将n个整数划分为两个子集。根据划分后枢轴所处的位置i分别处理:
①若i=n/2,则分组完成,算法结束;
②若i<n/2,则枢轴及之前的所有元素均属于Ar,继续对i之后的元素进行划分;③若 i> n/2),则枢轴及之后的所有元素均属于Az,继续对i之前的元素进行划分
(2)间代码实战部分。
(3) 基于该设计思想实现的算法,毋须对全部元素进行全排序,其平均时间复杂度是O(n),空间复杂度是O(1)。

代码实战

实现思想:

  • 本题可以用快速排序思想实现,不用考虑将序列排好序然后求|S1-S2|
  • 题目首要满足的条件是|n1-n2|最小,然后是|S1-S2|最大这很容易让我们想到
  • 将序列分为两个等长的序列这样|n1-n2|=0。并且当小的在一边,大的在一边此时会满足|S1-S2|最大
  • 我们可以直接使用快速排序或者堆排序进行排序,将会得到时间复杂度为O(n*(log2^n))的结果。
  • 本题中我们不在乎两部分是否有序,我们只在乎找出中位数。并将中位数放在n/2的位置。
  • 我们在可以借助快速排序的思想快速实现定位中位数。我们尝试将序列划分为两部分,左边是比
  • 分割元素小的,右边是比分割元素大的,会出现以下情况:
  • 当分割元素位于n/2位置时,此元素就是我们所要找到值。
  • 当分割元素位于n/2左边时,我们将舍弃分割元素及其左边元素,缩小分割
  • 有了上面的思路于是我们可以进行以下编码。

可以从下面图片中可以看出,无论在序列元素个数是奇数还是偶数的情况下结果都是准确的!
注意是先r--还是先l++,为了避免不必要的麻烦一定要按规范写!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
#define maxSize 11//数组最大容量
#define numWide 100//随机生成数据的范围
//考研2016年408第43题实战代码

int* initarray() {//--------------随机生成数据,1-100
    srand((unsigned)time(NULL));
    int *p=(int*) malloc(sizeof (int)*maxSize);
    for (int i = 0;i < maxSize;i++) {
        p[i] = rand() % numWide;
    }
    return p;
}
//打印排序好的数
void printMyarray(int myarray[]) {//-----------打印数据
    for (int i = 0;i < maxSize;i++) {
        printf("%3d",myarray[i]);
    }
    printf("\n");
}
//函数传参第一个参数为列表,第二个参数为列表长度
int SpliteArr(int *p,int n){
    int lt,rt,l=0,r=n-1,cur,flag=1,temp;
    while (flag){
        rt=r;
        lt=l;
        temp=p[l];
        while (l<r){
            while(l<r&&p[r]>=temp){
                r--;
            }
            p[l]=p[r];
            while (l<r&&p[l]<=temp){
                l++;
            }
            p[r]=p[l];
        }
        p[l]=temp;
        cur=l;
        if(cur>(n-1)/2){
            r=cur-1;
            l=lt;
        }else if(cur<(n-1)/2){
            l=cur+1;
            r=rt;
        }
        if(cur==(n-1)/2){
            flag=0;
        }
    }
    return n%2==0?p[cur+1]:p[cur];
}
void SelectSort(int *p){
    for(int i=0;i<maxSize-1;i++){
        for(int j=i+1;j<maxSize;j++){
            if(p[i]>p[j]){
                int temp=p[i];
                p[i]=p[j];
                p[j]=temp;
            }
        }
    }
}

int main(){
    int *p=initarray();
    printf("init arr!:");
    printMyarray(p);
    int *p1=initarray();
    SelectSort(p1);
    printf("sort arr!:");
    printMyarray(p1);

    printf("S2 is %d and later elements in the following sequence\n",SpliteArr(p,maxSize));
    printf("done!:");
    printMyarray(p);
    return 0;
}

题目二

在这里插入图片描述

分析

方法一:最小值(选择排序思想)⑴算法思想(高教社官方答案)

定义含10个元素的数组A,初始时元素值均为该数组类型能表示的最大数MAX。for M中的每个元素s
if (s <A[9])丢弃A[9]并将s按升序插人到A中;(插入排序的算法)当数据全部扫描完毕,数组A[0]~A[9]保存的即是最小的10个数。
2时间复杂度:O(n),每次要插人时都是需要对小数组A进行遍历的空间复杂度:O(1),中间过程额外需要常数个变量。
如果这里将10修改为k,则:
时间复杂度:O(nk),需要遍历k次数组。
空间复杂度:O(1),中间过程额外需要常数个变量。

方法二:堆(堆排序思想)

定义含10个元素的大根堆H,元素值均为该堆元素类型能表示的最大数MAX。for M中的每个元素s
if (s<H的堆顶元素)删除堆顶元素并将s插入到H中;当数据全部扫描完毕,堆H中保存的即是最小的10个数。
2〉算法平均情况下的时间复杂度是O(n),空间复杂度是O(1)。进一步解析:
先用A[0:9]原地建立大顶堆((注意:这里不能用小顶堆),遍历A[10:n],每个元素A[i]逐一和堆顶元素A[0]进行比较,其中11<i<n ,如果A[i]大于等于堆顶元素A[0],不进行任何操作,如果该元素小于堆顶元素A[0],那么就删除堆顶元素,将该元素放入堆顶,即
令A[0]=A[i],然后将A[0:9]重新调整为大顶堆。
最后堆A[0:9]中留存的元素即为最小的10个数。
方法三:(这个高教社没给) 通过快速排序
方法三:(这个高教社没给)
通过快速排序,分割思想,第一次知道n/2位置,再次 partition得到n/4,最终缩小为10个,就拿到了最小的10个元素,遍历的平均次数是n+n/2+n/4+…1,次数为2n,因此时
间复杂度为O(n)。由于我们不进行快排,只是记录剩余部分的起始和结束,因此空间复杂度是O(1)。

代码实战

代码实战。。。。这个题目没有要求代码实战,只要我们的思想是可行的,那么一定可以实现,如果感兴趣的话自己写一份代码吧,我就不瞎搞了。

补充(快排与归并)

偶然间发现快排与归并的实现思想有点类似,于是网上找了一下异同点,总结如下:
归并排序和快排的相同点:

  • 1,利用分治思想
  • 2,具体实现都用递归

归并排序和快排的不同点:

  • 1,先分解再合并:归并排序先递归分解到最小粒度,然后从小粒度开始合并排序,自下而上的合并排序;
  • 2,边分解边排序:快速排序每次分解都实现整体上有序,即参照值左侧的数都小于参照值,右侧的大于参照值;是自上而下的排序;
  • 3,归并排序不是原地排序,因为两个有序数组的合并一定需要额外的空间协助才能合并;
  • 4,快速排序是原地排序,原地排序指的是空间复杂度为O(1);
  • 5,归并排序每次将数组一分为二,快排每次将数组一分为三

数据结构大题注意点!!!(评分标准)

以下是本文第一题的评分标准!当在一定紧急情况下,可以断臂求生,没必要得到最优解(除非自己脑子非常清楚能写出来),先把该拿的分数拿到,然后将可能拿到的分拿到!
在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue+elementui实现app布局小米商城,样式美观大方,功能完整

目录 一、项目效果在线预览 二、效果图 1.首页效果图 2.分类&#xff0c;动态分类商品数据根据所属分类动态切换 3.购物车&#xff0c;动态添加购物车&#xff08;增、删、改、查&#xff09; 4.我的 5.登录注册 6.商品详情 7.搜索&#xff08;动态模糊搜索、搜索历史…

如何安装本地Go Tour教程(或者叫A Tour of Go离线版),以及中文版安装不了该怎么办

Go 官方是有一个在线教程 A Tour of Go&#xff0c;可以在线学习 Go 的编程&#xff0c;并且有中文版。英文原版页面如下&#xff1a; 出人意料的是&#xff0c;Go 提供了离线版&#xff08;各个语言都有&#xff09;&#xff0c;下载安装之后就可以在本地编译运行查看结果&a…

阿里云AliYun物联网平台使用-设备添加以及模拟设备端上云

一、前言 上一篇文章提到&#xff0c;我们已经申请了免费的阿里云平台&#xff0c;下面需要将我们的设备在阿里云上进行注册和申请&#xff0c;以便于我们的数据上云。 二、步骤 注册产品&#xff08;设备模型&#xff09; 在产品页面&#xff0c;点击 "创建产品" 。…

Blender基础入门(2):Blender简单渲染

文章目录 我个人的Blender专栏前言渲染基本常识科普Blender渲染设置Blender窗口分栏分屏渲染 渲染设置GPU渲染引擎推荐最大采样 切换摄像机渲染图片渲染采样512和4096差异512采样4096采样 渲染建议 我个人的Blender专栏 Blender简单教学 前言 渲染是从白模到成品的过程&…

go 爬虫速度控制

go 爬虫速度控制 使用go语言用原生net/http写爬虫如何优雅的控制并发和请求速度控制并发限流并发和限流的区别简单说明有了并发控制为什么还要限流 最总代码 使用go语言用原生net/http写爬虫如何优雅的控制并发和请求速度 go程序的执行效率相对python要快的多&#xff0c;且占…

货币政策和汇率波动——使用Python进行量化分析

货币政策和汇率波动是国际贸易和投资中的重要问题&#xff0c;对于投资者来说具有重要的影响。本文将介绍如何使用Python进行量化分析&#xff0c;以揭示货币政策和汇率波动之间的关系。 一、货币政策与汇率波动 货币政策作为国家宏观调控的一种手段&#xff0c;对汇率波动具…

ELK-日志服务【logstash-安装与使用】

目录 【1】安装logstash logstash input 插件的作用与使用方式 【2】input --> stdin插件&#xff1a;从标准输入读取数据&#xff0c;从标准输出中输出内容 【3】input -- > file插件&#xff1a;从文件中读取数据 【4】input -- > beat插件&#xff1a;从filebe…

赛效:如何用在线压缩GIF图片

1&#xff1a;在电脑网页上打开并登录快改图&#xff0c;点击左侧菜单栏里的“GIF压缩”。 2&#xff1a;点击页面中间的上传按钮&#xff0c;将电脑本地的GIF文件上传上去。 3&#xff1a;GIF文件上传成功后&#xff0c;设置下方压缩设置&#xff0c;点击右下角“开始压缩”。…

学习记录——Transformer、ViT、Swin-Transformer、SegFormer、TopFormer、Seaformer

Transformer 2017 Computation and Language Google Self-Attention、Multi-Head Attention 位置编码 原理参考链接 ransformer网络结构&#xff1a; ViT 2020 ICLR 将transformer引入到cv领域 将输入图片224x224x3按照16x16x3大小的Patch进行划分&#xff0c;接着通过…

Prometheus监控Tongweb容器

&#x1f3c5;概述 JMX Exporter主要是利用Java的JMX机制来读取JVM运行时的一些数据&#xff0c;然后转化为Prometheus可读取的metrics格式的数据。 JMX Exporter有两种用法&#xff1a; 启动独立进程。通过RMI读取JVM数据&#xff0c;但是单独进程监控也存在问题。JVM进程内启…

告别固定字体大小:CSS使用相对单位提升网页可访问性和兼容性

在 Web 开发领域中&#xff0c;有很多误解流传&#xff0c;即使它们被反驳了很多次也仍然存在。"外部链接应该总是在新标签页中打开" 就是一个很好的例子。CSS Tricks 在将近十年前就对此进行了详细的解释&#xff08;简而言之&#xff1a;大多数情况下是错误的&…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

R中高效安装包,以ComplexHeatmap包为例

包安装问题解决方案 1. Biocmanager安装 [2. 手动安装]&#xff08;正在更新……&#xff09; 目录 包安装问题解决方案前言1. install.packages()的介绍1.1 install.packages()的工作原理1.2 install.packages()安装失败的原因1.3 解决方案 2. BiocManage安装ComplexHeatmap总…

Android 中利用多个Button组合实现选项切换效果

效果图&#xff1a; xml布局: <LinearLayoutandroid:orientation"horizontal"android:layout_width"match_parent"android:layout_height"50dp"android:gravity"center"android:background"color/White">​<Linear…

Django_Paginator分页器

目录 分页器代码说明 简单demo 源码等资料获取方法 分页器代码说明 import os import random # 需要导入分页器类from django.core.paginator import Paginator, EmptyPage# 导入配置django配置文件 os.environ.setdefault(DJANGO_SETTINGS_MODULE, dailyfresh.settings)it…

SSH 远程口令登录及免密登录

简介&#xff1a; SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机使用SSH协议登录另一台计算机我们就可以认为这种登录时安全的&#xff0c;即使被中途截获,密码也不会泄露 安装 1.服务器安装OpenSSH(CentOS系统默认安装了openssh) 1.yum install op…

Linux 安装elasticsearch,kibana,Logstash

1、Elasticsearch 安装 cd /usr/localwget \ https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz \ https://artifacts.elastic.co/downloads/kibana/kibana-7.17.7-linux-x86_64.tar.gz \ https://artifacts.elastic.co/downlo…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 列式数据是如何存储与处理的

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

如何实现浏览器内多个标签页之间的通信?

1、使用 LocalStorage 特点&#xff1a;同域共享存储空间&#xff1b;持久化将数据存储在浏览器&#xff1b;提供事件监听storage变化 实现逻辑&#xff1a; A页面将数据存储在本地。B页面监听storage的变化&#xff0c;同步storage的最新数据&#xff1b; 好处&#xff1a;操…

探索MediaPipe的人像分割

MediaPipe是Google开源的计算机视觉处理框架&#xff0c;基于TensorFlow来训练模型。图像分割模块提供人像分割、头发分割、多类分割。本文主要探索如何实现人像分割&#xff0c;当然在人像分割基础上&#xff0c;我们可以做背景替换、背景模糊。 目录 一、配置参数与模型 1…