算法整理:排序

news2024/11/18 12:31:49

快速排序

首先不妨以第一个数为基准数,在一轮遍历后,使基准数左边的数都小于基准数,基准数右边的数都大于基准数。

当然也可以取中间的数为基准数。

  void quick_sort(vector<int>&nums,int l,int r){
        if(l>=r)return;
        int idx=l;//基准数选最左面
        int i=l;
        int j=r;
        while(i<j){
            while(i<j&&nums[j]>=nums[idx])j--;//右面先走
            while(i<j&&nums[i]<=nums[idx])i++;
            if(i<j){
                int t=nums[i];
                nums[i]=nums[j];
                nums[j]=t;
            }
        }
        int t=nums[idx];
        nums[idx]=nums[i];
        nums[i]=t;
        quick_sort(nums,l,i-1);
        quick_sort(nums,i+1,r);
    }

i,j相遇时,枢轴通常会被放置在两个指针相遇的位置上。

【排序算法】快速排序(C语言)_c语言快速排序-CSDN博客

霍尔法。(需要理解为什么,右面的先走。)

归并排序

数组操作 

void merge_sort(int q[],int l,int r){
    if(l>=r)return;
    int mid=(l+r)/2;
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    int k=0;
    int i=l;
    int j=mid+1;
    while(i<=mid&&j<=r){
        if(q[i]<=q[j])temp[k++]=q[i++];
        else temp[k++]=q[j++];
    }
    while(i<=mid) temp[k++]=q[i++];
    while(j<=r) temp[k++]=q[j++];
    for(k=0,i=l;i<=r;) q[i++]=temp[k++];
}

vector操作 

vector<int> mergeSort(vector<int>&nums,int l,int r){
        if(l==r)return {nums[l]};
        int mid=(l+r)/2;

//递归排序左右区间
        vector<int>left = mergeSort(nums,l,mid);
        vector<int>right = mergeSort(nums,mid+1,r);

//双指针合并两个有序区间
        vector<int>res; int n=left.size(); int m=right.size();
        int i=0;
        int j=0;
        while(i<n&&j<m){
            if(i<n&&j<m&&left[i]<right[j]){
                res.push_back(left[i++]);
            }else{
                res.push_back(right[j++]);
            }
        }
        while(i<n)res.push_back(left[i++]);
        while(j<m)res.push_back(right[j++]);
        return res;
}

选择排序 

void SelectSort(vector<int>&vec){
	int min_k;
	for(int i=0;i<vec.size();i++){
		min_k=i;
		for(int j=i;j<vec.size();j++){
			if(vec[j]<vec[min_k])swap(j,min_k);
		}
		swap(vec[min_k],vec[i]);
	}
}

基数排序

基数排序:
通过将待排序元素按照位数进行分组,逐位地进行排序,从最低位到最高位,最终得到有序的结果。
基数排序的工作原理如下:
首先,找到待排序元素中的最大值,确定它的位数。从最低位(个位)开始,按照该位的值将元素进行分组(0到9),形成桶。依次从最低位到最高位,对每个桶中的元素按照分组顺序重新排列。重复上述过程,直到按照所有位数完成排序,得到最终有序的结果。

第一轮

第二轮

堆排序

 堆是一个完全二叉树,使用顺序存储结构。

(1是根节点,i的左孩子结点的下标为2*i,右孩子结点的下标为2*i+1)。

大根堆:每个结点的值都比左子树和右子树所有结点的值大。

小根堆:每个结点的值都比左子树和右子树所有结点的值小。

排序思想
1.将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端

2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1(进行删除根节点操作)

3.将剩余的n-1个数再构造成大根堆(只需进行一次down操作),再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组。

堆的基本操作:调整:up(x); down(x);

(1)插入一个数:heap[++size]=x;up(size);

把这个数放到完全二叉树的最后,然后对这个数进行up调整。

(2)求集合当中的最小值:heap[1];

(3)删除最小值:heap[1]=heap[size];size--;down(1);

用完全二叉树的最后一个数替换根节点,然后对根节点进行down调整。

(4)修改任意一个元素:heap[k]=x;down(k);up(k);

修改对应元素后,先进行down操作,再进行up操作。

down(x)操作(小根堆为例):(log(n))

比较x与其左右孩子结点的大小关系,如果比左右孩子大,就交换两个结点。

void down(int u){
   int t=u;
   if(u * 2<=size && h[u*2]<h[t]) t = u*2;
   if(u * 2<=size && h[u*2+1]<h[t]) t = u*2+1;
   // t表示u和左孩子和右孩子最小值的下标
   // 如果u不是最小的,就交换x和t,并且递归对tdown操作
   if(u!=t){
      swap(h[u],h[t]);
      down(t);
   }
}

C++中堆的应用:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

// 创建一个小根堆
priority_queue<int, vector<int>, greater<int>>minHeap;

// 创建一个大根堆
priority_queue<int>maxHeap;

//加元素
minHeap.push(10);
maxHeap.push(8);

//遍历堆
while (!minHeap.empty()) {
   cout<<minHeap.top()<<" ";
   minHeap.pop();
}

//取堆顶元素
 minHeap.top();
 maxHeap.top();

//删除并返回堆顶元素
minHeap.top();
minHeap.pop();

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

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

相关文章

AI技术助推汽车行业走向更光明的未来

我们在汽车上度过的时间很多&#xff0c;有时候由于交通、天气和其他路况问题&#xff0c;我们在汽车上度过的时间之久甚至会出乎意料。正因如此&#xff0c;保障旅途体验的舒适和安全就显得至关重要。交通事故每天都会发生&#xff0c;因此在车辆中采取额外的安全措施对于所有…

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】 题目描述&#xff1a;解题思路一&#xff1a;双向链表&#xff0c;函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。一张图&#xff1a;知识点__slots__ 解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&am…

java Web 健身管理系统idea开发mysql数据库LayUI框架java编程计算机网页源码maven项目

一、源码特点 java Web健身管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 layUI bootst…

院内感染的相关因素分析(Boruta联合SHAP分析2)R

院内感染的相关因素分析&#xff08;Boruta联合SHAP分析2&#xff09;R 和鲸社区一键运行代码 院内感染是指住院患者在医疗机构内发生的感染&#xff0c;是医院管理中常见且严重的问题。院内感染不仅会延长患者住院时间&#xff0c;增加医疗费用&#xff0c;还会严重威胁患者生…

地表径流分布数据/水文站点分布/降雨量分布/辐射分布数据

引言 大气降水落到地面后&#xff0c;一部分蒸发变成水蒸气返回大气&#xff0c;一部分下渗到土壤成为地下水&#xff0c;其余的水沿着斜坡形成漫流&#xff0c;通过冲沟&#xff0c;溪涧&#xff0c;注入河流&#xff0c;汇入海洋。这种水流称为地表径流。 正文 数据简介 来自…

汉诺塔问题的递归算法解析

文章目录 汉诺塔问题的递归算法解析问题描述递归算法思路代码实现算法复杂度分析总结 汉诺塔问题的递归算法解析 问题描述 汉诺塔问题是一个经典的递归算法问题。问题描述如下&#xff1a; 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘…

普联一面4.2面试记录

普联一面4.2面试记录 文章目录 普联一面4.2面试记录1.jdk和jre的区别2.java的容器有哪些3.list set map的区别4.get和post的区别5.哪个更安全6.java哪些集合类是线程安全的7.创建线程有哪几种方式8.线程的状态有哪几种9.线程的run和start的区别10.什么是java序列化11.redis的优…

《C Prime Plus》02

1. UNIX 系统 C语言因UNIX系统而生&#xff0c;也因此而流行&#xff0c;所以我们从UNIX系统开始&#xff08;注意&#xff1a;我们提到的UNIX还包含其他系统&#xff0c;如FreeBSD&#xff0c;它是UNIX的一个分支&#xff0c;但是由于法律原因不使用该名称&#xff09;。 UN…

动手做一个最小Agent——TinyAgent!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前 言 大家好&#xff0c;我是不要葱姜蒜。在ChatGPT横空出世&#xff0c;夺走Bert的桂冠之后&#xff0c;大模型愈发地火热&#xff0c;国内各种模型层出不穷&#xff0c;史称“百模大战”。大模型的能力是毋…

备战蓝桥杯Day36 - 动态规划 - 三角形最小路径和问题

一、什么是动态规划 通过拆分问题&#xff0c;定义问题状态和状态之间的关系&#xff0c;使得问题能够以递推的方式解决。 哪些问题可以使用动态规划&#xff1f; 1、具有最优子结构&#xff1a;问题的最优解所包含的子结构的解也是最优的 2、具有无后效性&#xff1a;未来…

typdef:深入理解C语言中typdef关键词的用法

typedef&#xff1a;C语言中的类型重命名关键词 在C语言中&#xff0c;typedef 是一个非常有用的关键词&#xff0c;它允许我们为现有的数据类型定义一个新的名称。这不仅使得代码更加清晰易读&#xff0c;还提高了代码的可维护性。在这篇博客中&#xff0c;我们将深入探讨 ty…

0.17元的4位数码管驱动芯片AiP650,支持键盘,还是无锡国家集成电路设计中心某公司的

推荐原因&#xff1a;便宜的4位数码管驱动芯片 只要0.17元&#xff0c;香吗&#xff1f;X背景的哦。 2 线串口共阴极 8 段 4 位 LED 驱动控制/7*4 位键盘扫描专用电路 AIP650参考电路图 AIP650引脚定义

代码随想录第29天|491.递增子序列 46.全排列 47.全排列 II

目录&#xff1a; 491.递增子序列 46.全排列 47.全排列 II 491.递增子序列 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列_哔哩哔哩_bili…

C语言——常用库函数的使用及模拟实现

C语言编译系统为使用者提供了很多的预定义库函数。用户在编写程序时&#xff0c;可以直接调用这些库函数。这里选择了一些常用的库函数&#xff0c;简单介绍各个函数的使用方法&#xff1a; 字符串函数 字符串函数函数分为长度不受限制的字符串函数&#xff0c;和长度受限制的…

图的应用解析

01&#xff0e;任何一个无向连通图的最小生成树(B )。 A.有一棵或多棵 B.只有一棵 C.一定有多棵 D.可能不存在 02.用Prim算法和Kruskal算法构造图的最小生成树&#xff0c…

每日一题————P5725 【深基4.习8】求三角形

题目&#xff1a; 题目乍一看非常的简单&#xff0c;属于初学者都会的问题——————————但是实际上呢&#xff0c;有一些小小的坑在里面。 就是三角形的打印。 平常我们在写代码的时候&#xff0c;遇到打印三角形的题&#xff0c;一般简简单单两个for循环搞定 #inclu…

Element-Plus日期选择组件封装农历日期

背景 在使用element-plus开发项目过程中&#xff0c;需要填入人员的生卒日期&#xff0c;经观察&#xff0c;对于大部分人来说&#xff0c;这类日期通常是农历日期&#xff0c;然而我们在系统建设过程中&#xff0c;对于日期字段&#xff0c;约定成俗的都会使用公历日期&#…

机器学习的模型校准

背景知识 之前一直没了解过模型校准是什么东西&#xff0c;最近上班业务需要看了一下&#xff1a; 模型校准是指对分类模型进行修正以提高其概率预测的准确性。在分类模型中&#xff0c;预测结果通常以类别标签形式呈现&#xff08;例如&#xff0c;0或1&#xff09;&#xf…

day03-Docker

1.初识 Docker 1.1.什么是 Docker 1.1.1.应用部署的环境问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 例如一个项目中&#xff0c;部署时需要依…

拯救者Legion R9000X 2021(82HN)原装出厂Win10系统镜像ISO下载

lenovo联想拯救者笔记本R9000X 2021款原厂Windows10系统安装包&#xff0c;恢复出厂开箱状态预装OEM系统 链接&#xff1a;https://pan.baidu.com/s/1tx_ghh6k0Y9vXBz-7FEQng?pwd7mih 提取码&#xff1a;7mih 原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标…