10.16课上,煎饼排序(选择排序实现),冒泡排序,快速排序

news2024/11/18 7:28:36

煎饼排序

第一步找剩余数组里的最大值,然后从头到这里翻转一次,这样最大值就到了开头,再把开头从当前结尾翻转一次,就把当前的最大值翻转到了最后

class Solution {
public:
    vector<int> pancakeSort(vector<int>& arr) 
    {
        /*一种类选择排序的思路
        我们有一种方法可以把当前数组最大元素放到数组结尾
        假设当前数组长度为n 设最大元素的下标为index
        如果它的下标就在n - 1 那就不用翻转了 它已经处于正确位置了
        首先翻转index + 1 然后这个元素就会到首位
        然后翻转n 就是整个数组翻转一下 这个元素就会到末尾
        因此每次摆放玩最大元素就让数组长度减1,接着操作
        直到数组长度为1为止
        这样总共最多会翻转2 * (arr.length - 1)次 是符合题意的*/
        vector<int> ret;
        for (int n = arr.size(); n > 1; --n)
        {
            int index = max_element(arr.begin(), arr.begin() + n) - arr.begin();
            if (index == n - 1) continue;
            reverse(arr.begin(), arr.begin() + index + 1);
            reverse(arr.begin(), arr.begin() + n);
            ret.push_back(index + 1);
            ret.push_back(n);
        }
        return ret;
    }
};

D.2*(N-2)+1

快速排序思路

每次都选一个基元,然后有一个左指针和一个右指针,完成两个目的,一个是固定基元的最终实际位置,另一个是说,让其最终位置之前的元素都比它小,其之后的元素都比它大

如果左指针向后遍历,直到遇到第一个比基元大的;右指针向前遍历,直到遇到第一个比基元小的;都停止时,进行交换,然后重复这一过程,直到左指针和右指针指向同一个元素,这时就是终点,让其和基元交换,就是基元的最终位置

void quick_sort(int num[], int low, int high )
{
    int i,j,temp;
    int tmp;

    i = low;
    j = high;
    tmp = num[low];   //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数

    if(i > j)  //如果下标i大于下标j,函数结束运行
    {
        return;
    }

    while(i != j)
    {
        while(num[j] >= tmp && j > i)   
        {
            j--;
        }

        while(num[i] <= tmp && j > i)
        {
            i++;
        }

        if(j > i)
        {
            temp = num[j];
            num[j] = num[i];
            num[i] = temp;
        }
    }

    num[low] = num[i];
    num[i] = tmp;

    quick_sort(num,low,i-1);
    quick_sort(num,i+1,high);
}

冒泡排序的思路是

从头开始遍历,如果当前元素比后一个元素大,就交换其位置,如果说遇到了最大值,那么每次交换后,都必定比后一个元素大,所以就一定会“冒泡”到此时数组的最后一个位置,由此就是每次都会使当前数组里的最大元素冒泡到对应位置

‘冒泡排序的交换次数就是逆序数 

对于相邻的两个元素AB交换位置,不影响其前后所有元素的情况,也就是说只会影响这两个元素之间的关系,A和B后面的元素能组成逆序对时,AB交换后,A依然能和B后面的元素组成逆序对,如果AB构成逆序对,那么交换后AB的逆序对就消失了,所以相邻元素只会减少一个(交换的条件是前面元素比后面大,即交换时前面元素必定比后面元素大,即交换时就是逆序对),最后排序完后数组有序,逆序对都没了,那就是已经把所有逆序对都计上了

最多K次相邻交换

假设前i个是有序的,从第i个开始,往后k个找到最小的,然后和第i+1位交换(冒泡交换),共需要J-1次交换,那么此时还剩下k-j+1次交换次数,前i+1有序

递归解决,记录开始下标与剩余交换次数,直到下标到顶或者交换次数为0

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

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

相关文章

LCR 177. 撞色搭配

LCR 177. 撞色搭配 LCR 177. 撞色搭配 迷你游戏之寻找两个单身狗 int* sockCollocation(int* sockets, int socketsSize, int* returnSize) {int* arr (int*)malloc(2 * sizeof(int));int ret 0;for (int i 0; i < socketsSize; i){ret ^ sockets[i];}int pos 0;for…

软考系列(系统架构师)- 2018年系统架构师软考案例分析考点

试题一 软件架构&#xff08;非功能性需求、C/S 架构&#xff09; 【问题1】&#xff08;8分&#xff09; 在系统架构设计中&#xff0c;决定系统架构设计的非功能性需求主要有四类&#xff1a;操作性需求、性能需求、安全性需求和文化需求。请简要说明四类需求的含义。 (1) …

正点原子嵌入式linux驱动开发——Linux中断

不管是单片机裸机实验还是Linux下的驱动实验&#xff0c;中断都是频繁使用的功能&#xff0c;在裸机中使用中断需要做一大堆的工作&#xff0c;比如配置寄存器&#xff0c;使能IRQ等等。但是Linux内核提供了完善的中断框架&#xff0c;只需要申请中断&#xff0c;然后注册中断处…

C进阶-语言文件操作

本章重点&#xff1a; 什么是文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭文件的顺序读写文件的随机读写文件结束的判定 1. 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件 1.1 程序文件…

R语言中fread怎么使用?

R语言中 fread 怎么用&#xff1f; 今天分享的笔记内容是数据读取神器fread&#xff0c;速度嘎嘎快。在R语言中&#xff0c;fread函数是data.table包中的一个功能强大的数据读取函数&#xff0c;可以用于快速读取大型数据文件&#xff0c;它比基本的read.table和read.csv函数更…

吴恩达开新课了:面向所有人的生成式 AI 课程!我已偷偷学了起来

作者 | 智商掉了一地 斯坦福大学的吴恩达教授可能是许多人接触 AI 的启蒙课导师吧&#xff0c;在过去的十多年中&#xff0c;他的《Machine Learning》课程已经对数百万的学习者产生了积极影响。 ▲image.png 而随着 ChatGPT 的推出&#xff0c;大模型和各类生成式人工智能&am…

你知道谁是计算机之父吗?

“计算机之父” 这个词通常用来指代计算机科学领域的杰出人物&#xff0c;他们在计算机科学和技术的发展中发挥了重要作用。有多位人物被认为是计算机之父&#xff0c;其中包括&#xff1a; 查尔斯巴贝奇&#xff08;Charles Babbage&#xff09;&#xff1a;是英国的一位杰出的…

Node.js的安装

直接在浏览器中搜索Node.js即可 打开下载好的文件 验证是否安装成功 在cmd中输入 node -v&#xff0c;若结果为版本号那就是成功的 环境配置 配置全局模块所在的路径缓存cache的路径 在安装目录中新建两个文件夹&#xff0c;文件夹名为:node_cache和node_global 输…

STARKs with small finite field:小域带来的迷人性能

1. 引言 前序博客有&#xff1a; 2023年 ZK Hack以及ZK Summit 亮点记为何需关注各ZKP方案的benchmarks&#xff1f; 很久以前&#xff0c;有大量研究和开发致力于改进ZKP性能。研究人员通过采用多种不同的技术&#xff0c;包括但不限于&#xff1a; 不同的IOPs不同的多项式…

【Java 进阶篇】深入了解 Bootstrap 按钮和图标

按钮和图标在网页设计中扮演着重要的角色&#xff0c;它们是用户与网站或应用程序交互的关键元素之一。Bootstrap 是一个流行的前端框架&#xff0c;提供了丰富的按钮样式和图标库&#xff0c;使开发者能够轻松创建吸引人的界面。在本文中&#xff0c;我们将深入探讨 Bootstrap…

c++入门(命名空间, c++输入输出, 缺省参数)

文章目录 1. 命名空间正确的命名定义命名空间的使用 2. c输入与输出标准输入输出对象向流写入 读取数据 3. 缺省参数缺省参数分类缺省参数声明缺省参数初始值 c的简单介绍 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大…

全波形反演培训的思考与总结

一. InversionNet 最简单的端到端DL_FWI 1. 网络结构&#xff1a; 图1 构建了一个具有编码器-解码器结构的卷积神经网络&#xff0c;根据地震波动数据模拟地下速度结构。编码器主要由卷积层构建&#xff0c;它从输入地震数据中提取高级特征并将其压缩为单个高维向量。解码器然后…

轻量级导出 Excel 标准格式

一般业务系统中都有导出到 Excel 功能&#xff0c;其实质就是把数据库里面一条条记录转换到 Excel 文件上。Java 常用的第三方类库有 Apache POI 和阿里巴巴开源的 EasyExcel 等。另外也有通过 Web 模板技术渲染 Excel 文件导出&#xff0c;这实质是 MVC 模式的延伸&#xff0c…

系列四、FileReader和FileWriter

一、概述 FileReader 和 FileWriter 是字符流&#xff0c;按照字符来操作IO。 1.1、继承体系 二、FileReader常用方法 new FileReader(File/String)# 每次读取单个字符就返回&#xff0c;如果读取到文件末尾返回-1 read()# 批量读取多个字符到数组&#xff0c;返回读取的字节…

【C语言】每日一题(添加逗号)

添加逗号&#xff0c;链接奉上 目录 方法1&#xff1a;整体存入思路&#xff1a;代码实现&#xff1a; 方法2&#xff1a;分段输出思路&#xff1a;代码实现&#xff1a; 方法1&#xff1a;整体存入 思路&#xff1a; 整体思路&#xff1a; 我们发现这个整数N对于最后1位是比…

【Python生活脚本】视频转Gif动图

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-20 ❤️❤️ 本篇更新记录 2023-10-20 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

Juniper防火墙SSG-140 session 过高问题

1.SSG-140性能参数 2.问题截图 3.解决方法 &#xff08;1&#xff09;通过telnet 或 consol的方法登录到防火墙&#xff1b; &#xff08;2&#xff09;使用get session 查看总的session会话数&#xff0c;如果大于300 一般属于不正常情况 &#xff08;3&#xff09;使用get…

力扣每日一题48:旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

任务分配问题(回溯法)

算法设计 问题描述 有n&#xff08;n≥1&#xff09;个任务需要分配给n个人执行&#xff0c;每个任务只能分配给一个人&#xff0c;每个人只能执行一个任务。 第i个人执行第j个任务的成本是c[i][j]&#xff08;1≤i&#xff0c;j≤n&#xff09;。求出总成本最小的分配方案 …