排序与选择

算法排序分类

  • 基于比较的排序算法:
    • 交换排序
      • 冒泡排序
      • 快速排序
    • 插入排序
      • 直接插入排序
      • 二分插入排序
      • Shell排序
    • 选择排序
      • 简单选择排序
      • 堆排序
    • 合并排序
  • 基于数字和地址计算的排序方法
    • 计数排序
    • 桶排序
    • 基数排序

 简单排序算法

        冒泡排序

void sort(Item a[],int l,int r)
{for(int i=l+1;i<=r;i++){for(int j=i;j>1;j++){compswap(a[j-1],a[j]);}}
}

上述冒泡排序中,待排序元素类型是Item,算法根据Item类型元素的键值对数组元素a[l]~a[r]进行排序。算法中用到关于Item类型变量的一些常用运算:

typedef int Item;	//待排序元素类型
typedef Item* addr;#define key(A) A
#define less(A,B) (key(A)<key(B))
#define eq(A,B) (!less(A,B) && !less(B,A))
#define swap(A,B) {Item t=A;A=B;B=t;}
#define compswap(A,B) if(less(B,A))swap(A,B)void ItemShow(Item x)
{printf("%d \n",x);
}

其中,less(A,B)比较A和B的键值,等价于key(A)<key(B);

eq(A,B)等价于key(A)==key(B);

swap(A,B)交换两个元素的值;

compswap(A,B)等价于语句if(less(A,B)) swap(A,B),即当key(B)<key(A)时,交换A和B的值

        插入排序算法

 整个过程为n-1趟排序,即先将序列中第一个记录看成是一个有序子序列,然后从第二个记录开始,逐个进行插入,直至整个序列有序。

整个元素插入过程由算法insert来完成

void insert(Item a[],int l,int i)
{Item v=a[i];while(i>1 && less(v,a[i-1])){a[i]=a[i-1];i--;}a[i]=v;
}//插入排序算法通过反复调用insert来完成排序任务void sort(Item a[],int l,int r)
{for(int i=l+1;i<=r;i++)insert(a,l,i);
}
         二分插入排序

用二分查找方法确定插入位置的排序

         希尔排序(缩小增量法)

基本思想:先取一个正整数d1<n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直到di=1,即所有记录放进一个组中排序为止。

快速排序算法

排序——快速排序(Quick sort)-CSDN博客

typedef int T;
//快速排序算法QuickSort的实现
void QuickSort(T a[], int p, int r)		//p,r都是下标
{if (p < r){int q = Partition(a, p, r);		//划分QuickSort(a, p, q - 1);		//对左端快速排序QuickSort(a, q + 1, r);		//对右端快速排序}
}	//对a[0:n-1]快速排序只要调用QuickSort(a,0,n-1)//划分(Partition)的实现
int Partition(T a[], int p, int r)
{int i = p;int j = r + 1;T x = a[p];while (true){while (a[++i] < x);while (a[--j] > x);if (i >= j)break;Swap(a[i], a[j]);}a[p] = a[j];a[j] = x;return j;
}

        随机快速排序算法

 在Partition划分的基准值不固定为数组的第一个值,而是随机在a[p:r]中挑选

//随机划分的实现
int RandomizedPartition(T a[], int p, int r)
{int i = Random(p, r);Swap(a[i], a[p]);return Partition(a, p, r);
}//随机快速排序算法
void RandomizedQuicckSort(T a[], int p, int r)
{if (p < r){int q = RandomizedPartition(a, p, r);RandomizedPartition(a, p, q - 1);RandomizedPartition(a, q + 1, r);}
}

 合并排序算法(非就地)

数据结构和算法:归并排序(合并排序)详解_合并排序是采用分治策略实现对n个元素进行排序的算法,是分治法的一个典型应用和完-CSDN博客

 

//非递归版的合并排序算法
void MergeSort(T a[], int n)
{T* b = new T[n];int s = 1;while (s < n){MergePass(a, b, s, n);	//合并到数组bs += s;MergePass(b, a, s, n);	//合并到数组as += s;}
}
//需要的函数
//合并x[]中大小为s的相邻子数组到y[]中
void MergePass(T x[], T[y], int s, int n)
{int i = 0;while (i <= n - 2 * s){Merge(x, y, i, i + s - 1, i + 2 * s - 1);i = i + 2 * s;}//剩下的元素个数少于2sif (i + s < n){Merge(x, y, i, i + s, n - 1);}else{for (int j = i; j <= n - 1; j++){y[i] = x[i];}}
}
//有序的合并c[l:m]和c[m+1:r]到d[l:r]
void Merge(T c[], T d[], int l, int m, int r)
{int i = l;j = m + 1;k = l;while ((i <= m) && (j <= r)){if (c[i] <= c[j]){d[k++] = c[i++];}elsed[k++] = c[j++];}if (i > m){for (int q = j; q <= r; q++){d[k++] = c[q];		//c[m+1,r]到位}}else{for (int q = i; q <= m; q++){d[k++] = c[q];		//c[l:m]到位}}
}

特殊有序集的线性时间排序算法   

        计数排序算法 

//算法的实现
void CountingSort(int m,int a[],int n,int b[])
{int c[m+1];for(int i=0;i<=m;i++){c[i]=0;}for(int i=0;i<n;i++){c[a[i]]+=1;}//c[i]中存放的是a中键值对等于i的元素个数for(int i=1;i<=m;i++){c[i]+=c[i-1];}//c[i]中存放的是a中键值对小于或等于i的元素个数for(int i=n;i>0;i--){b[c[a[i-1]]-1]=a[i-1];c[a[i-1]]-=1;		//具有排序的稳定性}
}

        桶排序 

基数排序 

        多关键字排序

 

 中位数与第k小元素

T RandomizeSelect(T a[],int p,int r,int k)
//p,r是下标,要求p<=r,1<=k<=r<=r-p+1
{if(p==r)return a[p];int i=RandomizePartition(a,p,r);int j=i-p+1;		//左段的元素个数if(k<=j)return RandomizeSelect(a,p,i,k);elsereturn RandomizeSelect(a,i+1,r,k-j);
}
//为在a[0:n-1]中找第k小,只要调用RandomizeSelect(a,0,n-1,k)

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨端分栏布局:从手机到Pad的优雅切换

在 UniApp X 的世界里&#xff0c;我们常常需要解决一个现实问题&#xff1a; “手机上是全屏列表页&#xff0c;Pad上却要左右分栏”。这时候&#xff0c;很多人会想到 leftWindow 或 rightWindow。但别急——这些方案 仅限 Web 端&#xff0c;如果你的应用需要跨平台&#xf…

华为服务器管理工具(Intelligent Platform Management Interface)

一、核心功能与技术架构 硬件级监控与控制 全维度传感器管理:实时监测 CPU、内存、硬盘、风扇、电源等硬件组件的温度、电压、转速等参数,支持超过 200 种传感器类型。例如,通过 IPMI 命令ipmitool sdr elist可快速获取服务器传感器状态,并通过正则表达式提取关键指标。 远…

Node.js Express keep-alive 超时时间设置

背景介绍随着 Web 应用并发量不断攀升&#xff0c;长连接&#xff08;keep-alive&#xff09;策略已经成为提升性能和资源复用的重要手段。本文将从原理、默认值、优化实践以及潜在风险等方面&#xff0c;全面剖析如何在 Node.js&#xff08;Express&#xff09;中正确设置和应…

学习C++、QT---30(QT库中如何自定义控件(自定义按钮)讲解)

每日一言你比想象中更有韧性&#xff0c;那些看似艰难的日子&#xff0c;终将成为勋章。自定义按钮我们要知道自定义控件就需要我们创建一个新的类加上继承父类&#xff0c;但是我们还要注意一个点&#xff0c;就是如果我们是自己重头开始造控件的话&#xff0c;那么我们就直接…

【补充】Linux内核链表机制

专题文章&#xff1a;Linux内核链表与Pinctrl数据结构解析 目标&#xff1a; 深入解析Pinctrl子系统中&#xff0c;struct pinctrl如何通过内核链表&#xff0c;来组织和管理其多个struct pinctrl_state。 1. 问题背景&#xff1a;一个设备&#xff0c;多种引脚状态 一个复杂的…

本地部署Dify、Docker重装

需要先安装一个Docker&#xff0c;Docker就像是一个容器&#xff0c;将部署Dify的空间与本地环境隔离&#xff0c;避免因为本地环境的一些问题导致BUG。也确保了环境的统一&#xff0c;不会出现在自己的电脑上能跑但是移植到别人电脑上就跑不通的情况。那么现在就开始先安装Doc…

【每天一个知识点】非参聚类(Nonparametric Clustering)

ChatGPT 说&#xff1a;“非参聚类”&#xff08;Nonparametric Clustering&#xff09;是一类不预先设定聚类数目或数据分布形式的聚类方法。与传统“参数聚类”&#xff08;如高斯混合模型&#xff09;不同&#xff0c;非参聚类在建模过程中不假设数据来自于已知分布数量的某…

人形机器人CMU-ASAP算法理解

一原文在第一阶段&#xff0c;用重定位的人体运动数据在模拟中预训练运动跟踪策略。在第二阶段&#xff0c;在现实世界中部署策略并收集现实世界数据来训练一个增量&#xff08;残差&#xff09;动作模型来补偿动态不匹配。&#xff0c;ASAP 使用集成到模拟器中的增量动作模型对…

next.js刷新页面时二级菜单展开状态判断

在 Next.js 中保持二级菜单刷新后展开状态的解决方案 在 Next.js 应用中&#xff0c;当页面刷新时保持二级菜单的展开状态&#xff0c;可以通过以下几种方法实现&#xff1a; 方法1&#xff1a;使用 URL 参数保存状态&#xff08;推荐&#xff09; import { useRouter } from n…

网络基础DAY13-NAT技术

NAT技术internet接入方式&#xff1a;ADLS技术&#xff1a;能够将不同设备的不同信号通过分离器进行打包之后再internet中传输&#xff0c;到另一端的分离器之后再进行分离。传输到不同的设备中去。常见光纤接入方式internet接入认证方式&#xff1a;PPPoE&#xff1a;先认证再…

HBuilderX中设置 DevEco Studio路径,但是一直提示未安装

前言&#xff1a; HBuilderX中设置 DevEco Studio路径&#xff0c;但是一直提示未安装。 报错信息&#xff1a; 检测到鸿蒙工具链&#xff0c;请在菜单“工具->设置->运行配置”中设置鸿蒙开发者工具路径为 DevEco Studio 的安装路径&#xff0c;请参考 报错原因…

什么是GNN?——聚合、更新与循环

在传统的深度学习中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;擅长处理网格结构数据&#xff08;如图像&#xff09;&#xff0c;循环神经网络&#xff08;RNN&#xff09;擅长处理序列数据&#xff08;如文本&#xff09;。但当数据以图的形式存在时&#xff08;如…

深入解析 Django REST Framework 的 APIView 核心方法

在 Python 3 中&#xff0c;Django 的 APIView 类是 Django REST Framework&#xff08;DRF&#xff09;中用于构建 API 视图的核心基类。它提供了一个灵活的框架来处理 HTTP 请求&#xff0c;并通过一系列方法支持认证、权限检查和请求限制等功能。self.perform_authenticatio…

神经网络——卷积层

目录 卷积层介绍 Conv2d 卷积动画演示 卷积代码演示 综合代码案例 卷积层介绍 卷积层是卷积神经网络&#xff08;CNN&#xff09;的核心组件&#xff0c;它通过卷积运算提取输入数据的特征。 基本原理 卷积层通过卷积核&#xff08;过滤器&#xff09;在输入数据&…

神经网络——线性层

在机器学习中&#xff0c;线性层&#xff08;Linear Layer&#xff09; 是一种基础的神经网络组件&#xff0c;也称为全连接层&#xff08;Fully Connected Layer&#xff09; 或密集层&#xff08;Dense Layer&#xff09;。 其严格的数学定义为&#xff1a;对输入数据执行线…

大模型高效适配:软提示调优 Prompt Tuning

The Power of Scale for Parameter-Efficient Prompt Tuning ruatishi 软提示向量 具体是什么 《The Power of Scale for Parameter-Efficient Prompt Tuning》中增加的部分是“软提示(soft prompts)”,这是一种针对特定下游任务,添加到输入文本中的可调参数序列。它与传统…

https正向代理 GoProxy

背景&#xff1a; 在安全隔离的内网环境中&#xff0c;部署于内网的应用如需调用公网第三方接口&#xff08;如支付、短信&#xff09;&#xff0c;可通过正向代理服务实现访问。 GoProxy 下载&#xff1a; https://github.com/snail007/goproxy/releases 使用文档&#xff…

Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践

一、字节流与字符流&#xff1a;如何选择&#xff1f; 1.1 核心区别特性字节流字符流处理单位字节&#xff08;8位&#xff09;字符&#xff08;16位Unicode&#xff09;适用场景二进制文件&#xff08;图片/视频&#xff09;文本文件&#xff08;TXT/CSV&#xff09;编码处理需…

QT6 源,七章对话框与多窗体(5) 文件对话框 QFileDialog 篇二:源码带注释

&#xff08;13&#xff09;本源代码定义于头文件 qfiledialog . h &#xff1a; #ifndef QFILEDIALOG_H #define QFILEDIALOG_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtCore/qdir.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h…

关于Ajax的学习笔记

Ajax概念&#xff1a;是一门使用了js语言&#xff0c;可以使用于Javaweb&#xff0c;实现前端代码和后端代码连结的的一种异步同步&#xff08;不需要等待服务器相应&#xff0c;就能够发送第二次请求&#xff09;的一种技术&#xff0c;它主要用于网页内容的局部刷新&#xff…