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

news2024/11/24 9:43:26

文章目录

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

题目一

在这里插入图片描述

分析

(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,归并排序每次将数组一分为二,快排每次将数组一分为三

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

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


在这里插入图片描述

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

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

相关文章

FreeRTOS实时操作系统(十三)任务通知

系列文章目录 文章目录 系列文章目录任务通知任务通知值和通知状态任务通知值通知状态 任务通知API函数发送通知函数接收通知函数 实验测试模拟二值信号量实验模拟计数型信号量模拟事件标志组实验模拟消息邮箱实验 任务通知 任务通知&#xff1a;用来通知任务的&#xff0c;任…

ATMEGA16 Proteus仿真自动人体感应电风扇DS18B20温度 -0069

ATMEGA16 Proteus仿真自动人体感应电风扇DS18B20温度 -0069 Proteus仿真小实验&#xff1a; ATMEGA16 Proteus仿真自动人体感应电风扇DS18B20温度 -0069 功能&#xff1a; Protues版本&#xff1a;7.8 程序编写&#xff1a;ICCAVR:7.12 硬件组成&#xff1a;ATMEGA16单片机…

嵌入式开发之编码器速度采集

光电编码器&#xff0c;是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是应用最多的传感器&#xff0c;光电编码器是由光源、光码盘和光敏元件组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴&#xff0c;…

spark和zeppelin认证不一致:Only one of --proxy-user or --principal can be provided

spark和zeppelin认证不一致&#xff1a;Only one of --proxy-user or --principal can be provided 如果配置principal认证方式&#xff0c;zeppelin走的是hadoop权限&#xff0c;如果配置proxy-user认证方式&#xff0c;zeppelin走的是当前登录用户的权限&#xff08;ranger控…

GitHub上cambel的ur3项目调试经验

按照https://github.com/cambel/ur3/wiki/Compile-from-source配置环境时&#xff0c;遇到以下问题&#xff1a; catkin clean时报错 [clean] Error: The current or desired workspace could not be determined. Please run catkin clean from within a catkin workspace or…

【学会动态规划】第 N 个泰波那契数(1)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 4. 空间优化 写在最后 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟…

MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

MySQL 中的索引 前言 上篇文章聊完了 MySQL 中的锁&#xff0c;这里接着来看下 MySQL 中的索引。 一般当我们数据库中的某些查询比较慢的时候&#xff0c;正常情况下&#xff0c;一顿分析下来&#xff0c;大多数我们会考虑对这个查询加个索引&#xff0c;那么索引是如何工作的呢…

从零开始的前后端分离项目学习(前后端从零环境搭建)

一、 前后端分离介绍&#xff1a; 前端独立编写客户端代码&#xff08;用户交互数据展示&#xff09;&#xff0c;后端独立编写服务端代码&#xff08;提供数据处理接口&#xff09;&#xff0c;并提供数据接口就行。 前端通过Ajax访问后端数据借口&#xff0c;将model展示到…

使用VESD脉冲离子风机5年内至少可节省一半的维护成本

之前的文章有给大家详细介绍过&#xff0c;来自VESD的脉冲离子风机&#xff0c;它有着特殊的设计&#xff1a;插拔式结构和可水洗针架&#xff0c;因此对我们的很多客户来说&#xff0c;这款风机性价比是非常高的。 早在15年以前&#xff0c;VESD就对市面上大部分风机进行过测试…

解决Google浏览器网页覆盖问题

在使用 Google 进行搜索的时候出现打开新页面会覆盖当前页面的问题 针对此问题&#xff0c;解决方法如下&#xff1a; 1、首先在浏览器的地址栏中随便搜索内容 2、页面的 右上角有个⚙️的设置图标&#xff0c;点进去 点击 “查看所有设置” 3、在结果打开方式中进行勾选 设…

uniapp打包APP实现应用内整包更新或热更新

思路&#xff1a; 1.首先要理解更新方式的区别 静默更新、弱更新以及强制更新。 APP更新机制-静默更新、弱更新、强更新 - 知乎 2.其次要理解不同更新方式要用到的插件----------这里推荐插件应用市场的插件。 app升级、整包更新和热更新组件 支持vue3 支持打开安卓、苹果应…

使用 SMT求解机 根据变迁关系生成迁移后系统的状态

本文的例子来源于2011年发布的论文 IC3: Where Monolithic and Incremental Meet 文章目录 Ⅰ、变迁系统的介绍状态图变迁公式 Ⅱ、SMT求解机简介公式的计算计算另一状态 结果展示参考文献 Ⅰ、变迁系统的介绍 状态图 论文中给出了一个系统的状态迁移图和它的的变迁公式。现在…

【近场社交项目】数据库系统期末设计——概念设计部分

数据库系统期末设计——概念设计部分&#x1f60e; 前言&#x1f64c;项目设计&#xff08;1&#xff09;各个实体属性ER图&#xff08;2&#xff09;各个业务功能的ER图 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#x…

【Redis】特殊数据类型 Geo (地理位置)

&#x1f3af;前言 除了五中基本的数据类型外&#xff0c;Redis还支持两种特殊的数据类型&#xff0c;第一种 Geo (地理位置)&#xff1a;用于存储地理位置相关的数据&#xff0c;例如经纬度、距离等。第二种 Stream (流)&#xff1a;是一个高级的列表类型&#xff0c;支持对列…

Python基于pandas库导出excel文件

将Pandas数据框架导出到Excel文件中 让我们看看如何将Pandas数据框架导出到Excel文件中。 实列代码&#xff1a; import time import pandas as pd from io import BytesIO from flask import make_response,def export_navi():# 所有DataFrame合并集合df_list []# 创建一个数…

理工大学|校企联手创典范,布局存储新未来

某理工大学地质灾害防治与地质环境保护国家重点实验室的前身是1989年由原国家计委、国家教委批准&#xff0c;在某理工大学&#xff08;原某地质学院&#xff09;“地质工程”国家重点学科基础上建立的国家专业实验室&#xff0c;该实验室是我国地质灾害防治领域目前唯一的国家…

唯一无副作用禁用Win10/11更新方法,一键暂停1000周

作为一个现代化的系统&#xff0c;Windows 很早便配备了自动更新功能以快速获取新功能、修复安全漏洞。 不过到实际使用中嘛&#xff0c;自动弹出、重启自动进行、新版本大量 Bug … 体验十分糟糕。 种种原因导致&#xff0c;经常就有朋友要禁止 Win10/11 自动更新方法。 我们…

MySQL-存储函数练习

创建表并插入数据 ​ 字段名 数据类型 主键 外键 非空 唯一 自增 ​ id INT 是 否 是 是 否 ​ name VARCHAR(50) 否 否 是 否 否 ​ glass VARCHAR(50) 否 否 是 否 否mysql>…

vue项目启动前端时让本地局域网其他设备访问本项目时的配置

文章目录 编辑package.json优化 编辑package.json "dev": "vite --host [本机ip]" ,案例 优化 这样的话实用性更好&#xff0c;我们访问的话依然可以正常访问服务端的ip "dev": "vite --host 0.0.0.0" ,

Kylin麒麟系统设置开机自动登录roo账户

1.安装麒麟系统后&#xff0c;默认root用户是不开启的&#xff0c;首先得设置root用户密码命令。 sudo passwd root 此时会要求输入密码&#xff0c;输入您当前用户登录密码即可。 2.以root权限修改 /usr/share/lightdm/lightdm.conf.d/60-kylin.conf 文件,如提示输入密码&am…