计算机基础——经典排序算法总结

1.选择排序

找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法我们称之为选择排序。
性质:1、时间复杂度:O(n^2) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序
注:
排序算法的稳定性
1) 稳定的:如果存在多个具有相同排序码的记录,经过排序后,这些记录的相对次序仍然保持不变,则这种排序算法称为稳定的。
插入排序、冒泡排序、归并排序、分配排序(桶式、基数)都是稳定的排序算法。
2)不稳定的:否则称为不稳定的。
直接选择排序、堆排序、shell排序、快速排序都是不稳定的排序算法。

void SelectSort(int a[],int n){for(int i=0;i<n;i++){int min=i;for(int j=i;j<n;j++){if(a[j]<a[min])min=j;//找到值最小的下标}//找完开始交换int tmp=a[i];a[i]=a[min];a[min]=tmp;}
}

2.插入排序

插入排序,好比打扑克,理牌的时候从左开始,抓一张往前找它该在的位置,然后插入,插入位置后面的牌后移。

性质:1、时间复杂度:O(n^2) 2、空间复杂度:O(1) 3、稳定排序 4、原地排序
元素集合越接近有序,直接插入排序算法的时间效率越高

void InsertSort(int a[],int n){for(int i=0;i<n;i++){int j=i-1;int tmp=a[i];while(j>=0&&a[j]>tmp){//一边j前移,一边把经过的值后移a[j+1]=a[j];j--;}a[j+1]=tmp;}
}

3.冒泡排序

冒泡排序的原理是:从左到右,总是相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。这一路上一边比较一边交换。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

性质:1、时间复杂度:O(n^2) 2、空间复杂度:O(1) 3、稳定排序 4、原地排序

void BubbleSort(int a[],int n){for(int i=0;i<n;i++){//最多n轮for(int j=0;j<n-i-1;j++){//每轮都是从头开始if(a[j]>a[j+1]){//每次都是相邻的比较和交换int tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}}
}

优化一下冒泡排序的算法

假如从开始的第一对到结尾的最后一对,相邻的元素之间都没有发生交换的操作,这意味着右边的元素总是大于等于左边的元素,此时的数组已经是有序的了,我们无需再对剩余的元素重复比较下去了。

void BubbleSort(int a[],int n){for(int i=0;i<n;i++){//最多n轮for(int j=0;j<n-i-1;j++){//每轮都是从头开始if(a[j]>a[j+1]){//每次都是相邻的比较和交换int tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}}
}

4.快排

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中
的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值
子序列中所有元素均大于基准值
,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(logn) 3、非稳定排序 4、原地排序

void QuickSort(int a[],int l,int r){if(l>=r) return ;int i=l,j=r,x=a[l];while(i<j){while(i<j&&a[j]>=x)j--;a[i]=a[j];while(i<j&&a[i]<=x)i++;a[j]=a[i];}a[i]=x;QuickSort(a,l,i-1);QuickSort(a,i+1,r);
}

5.堆排

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

升序:建大顶堆,每次将最大的挑出来,和最后一个值交换(放最后),然后排除最后一个调整堆,得到下一个最大值,依此类推。

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序

这是一个以前我写堆排例子(非标准流程)寻找大富翁(堆排)

6.归并排序

将一个大的无序数组有序,我们可以把大的数组分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的,所以在合并的时候是很快的。
通过递归的方式将大的数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了,之后再把两个数组大小为1的合并成一个大小为2的,再把两个大小为2的合并成4的 …… 直到全部小的数组合并起来。

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(n) 3、稳定排序 4、非原地排序

void merge(int l,int m,int r)
{int i,j,k=l;//赋值到b[]中对应位置,b[]中是有序的for(i=l,j=m+1;i<=m&&j<=r;){if(a[i]<=a[j]) b[k++]=a[i++];else{b[k++]=a[j++];count+=m-i+1;}}for(;i<=m;i++) b[k++]=a[i];for(;j<=r;j++) b[k++]=a[j];for(i=l;i<=r;i++) a[i]=b[i];//b[]中的值重新赋到a[]中去
}
void m_sort(int l,int r)
{if(l<r){int mid=(l+r)/2;m_sort(l,mid);m_sort(mid+1,r);merge(l,mid,r);}return ;
}

7.希尔排序

希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它正确的位置很远的话,则需要与相邻元素交换很多次才能到达正确的位置,这样是相对比较花时间了。
希尔排序的思想是采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。

性质:1、时间复杂度:O(nlogn) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序

#include <stdio.h>
int n,a[10001];
void shell_sort(int d) //d为增量
{int i,j,t;for(i=d;i<n;i++){for(j=i-d;j>=0;j-=d){if(a[j+d]<a[j]){t=a[j+d];a[j+d]=a[j];a[j]=t;}}}
}
int main()
{int i;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){scanf("%d",&a[i]);}shell_sort(n/2);for(i=0;i<n-1;i++){printf("%d ",a[i]);}printf("%d\n",a[n-1]);shell_sort(1);for(i=0;i<n-1;i++){printf("%d ",a[i]);}printf("%d\n",a[n-1]);}return 0;
}

8.桶排

桶排序就是把最大值和最小值之间的数进行瓜分,例如分成 10 个区间,10个区间对应10个桶,我们把各元素放到对应区间的桶中去,再对每个桶中的数进行排序,可以采用归并排序,也可以采用快速排序之类的。

性质:1、时间复杂度:O(n+k) 2、空间复杂度:O(n+k) 3、稳定排序 4、非原地排序

以前写得桶排例子超排序(桶排)

注:
这篇博客用java代码实现十大排序算法十大经典排序算法

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

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

相关文章

[已解决] AI2THOR-2.1.0的卡死问题

在使用一些数据集的时候&#xff0c;例如ALFRED&#xff0c;需要调用AI2THOR-2.1.0版本。调用如下的测试脚本测试AI2THOR-2.1.0的安装情况&#xff1a; from ai2thor.controller import Controllerc Controller() c.start() event c.step(dict(action"MoveAhead")…

01 Swift 基础语法(变量,常量,注释,整数,浮点数,元组)

Swift 介绍 Swift 是一门用于开发 iOS、macOS、watchOS 和 tvOS 应用的新编程语言。它以安全、快速和互动的特点而著称。Swift 提供了代码预览&#xff08;playgrounds&#xff09;功能&#xff0c;使程序员可以在不编译和运行应用程序的情况下&#xff0c;实时运行 Swift 代码…

React面试题(二)

说说React的事件机制 是什么 React基于浏览器的事件机制自身实现了一套事件机制&#xff0c;包括事件注册&#xff0c;事件的合成&#xff0c;事件派发等 在React中这套事件机制被称之为合成事件 合成事件&#xff08;SyntheicEvent&#xff09; 合成事件是React模拟原生DO…

如何实现CloudFlare免费内网穿透?

有时候我们可能需要用到内网穿透技术,将本机的资源开放到网络上供人访问! 但是有时候我们只需要将一个项目开放的时候,使用frp就有点不划算了,特别是近几年服务器的价格水涨船高,要知道使用frp需要一台服务器和一个域名才可以的,这不今天就告诉大家一个用cloudflare实现…

Python web 开发 flask 实践

1、前言 前文已经介绍了很多关于 python 的算法和脚本的写法&#xff0c;在本文将开启python的 web 的开发&#xff0c;和java 类似的&#xff0c;对于 web 开发也需要引入框架&#xff0c;对于 python 的 web 开发来说常见的有 flask 和 django 两种&#xff0c;在本文中将要…

vscode用vue框架1写一个登陆页面

目录 一、创建登录页面 二、构建好登陆页面的路由 三、编写登录页代码 1.添加基础结构 2.给登录页添加背景 3.解决填充不满问题 4.我们把背景的红颜色替换成背景图&#xff1a; 5.在页面中央添加一个卡片来显示登录页面 6.设置中间卡片页面的左侧 7.设置右侧的样式及…

华芯微特SWM34-使用定时器捕获快速解码EV1527编码

在无线应用领域&#xff0c;很多433Mhz和315Mhz的遥控器&#xff0c;红外探测器&#xff0c;门磁报警器&#xff0c;无线门铃等都使用EV1527编码格式来发射数据。发射和接收均有对应的RF芯片完成&#xff0c;而且成本极低&#xff08;目前市场价3毛钱不到&#xff09;。接收芯片…

复分析——第7章——ζ 函数和素数定理(E.M. Stein R. Shakarchi)

第7章 ζ函数和素数定理 Bernhard Riemann, whose extraordinary intuitive powers we have already mentioned, has especially renovated our knowledge of the distribution of prime numbers, also one of the most mysterious questions in mathematics. He has tau…

《中国尘肺病农民工调查报告(2023)》

这份报告由中华社会救助基金会大爱清尘基金发布。 《中国尘肺病农民工调查报告(2023)》是一份深入探讨中国尘肺病农民工现状与挑战的研究报告。报告不仅详细记录了尘肺病患者的生存困境、经济与医疗状况,还对政策的实施效果进行了评估,并提出了针对性的建议。通过对不同地区、…

Vitis Accelerated Libraries 学习笔记--Vision 库介绍

目录 1. 简介 2. 分类介绍 2.1 图像容器 2.2 图像处理基础 2.3 图像滤波和平滑 2.4 图像变换和增强 2.5 图像分析和特征检测 2.6 数学和算术操作 2.7 图像校正和优化 2.8 颜色和阈值处理 2.9 高级图像处理 2.10 光流和运动估计 2.11 图像转换和映射 2.12 其他特殊…

docker camunda 8.5 部署步骤

Camunda Platform 8 环境准备 Docker 版本要求 Docker 20.10.16 is required; docker compose version 1.27.0.;github 开源地址:https://github.com/camunda/camunda-platformcamunda7 文档地址:https://docs.camunda.org/manual/7.21/user-guide/process-engine/社区地址: …

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点&#xff0c;一是组件的状态切换与buffer的流转过程&#xff0c;这部分内容我们已经在IL Spec中学习过了&#xff1b;二是OMX组件使用的buffer类型与buffer分配过程&#xff0c;这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

业务架构交付物

背景 业务的核心元素、扩展元素以及它们的协同关系&#xff0c;业务架构和其他架构的关系等等已经有了不少认识&#xff0c;那么&#xff0c;通过对业务架构的还原和分析&#xff0c;到底能够得到什么业务架构的内容呢&#xff1f;它可以是一套流程框架体系&#xff0c;也可以…

探索约束LLM输出JSON的应用

0、 引言 JSON&#xff08;JavaScript Object Notation&#xff09;因其简洁、易读和易于解析的特性&#xff0c;已成为全球使用最广泛的数据交换格式之一。它能够满足各种数据交换需求&#xff0c;特别是在构建人工智能驱动的应用程序时&#xff0c;工程师们经常需要将大型语…

深度学习工具|LabelImg(标注工具)的安装与使用教程

1 简介 Label是一款免费的图像标注软件&#xff0c;可以以矩形框的形式对图像中的物体进行标记&#xff0c;常用于分类和目标检测。并可以将标记信息保存为PasclVOC&#xff08;xml&#xff09;、YOLO&#xff08;txt&#xff09;、CreateML&#xff08;json&#xff09;格式。…

Python中对含有转义字符的变量,如何处理

file_path C:\Users\EDY\PJ-IPAStudio\designer\project 这是一个路径的字符串&#xff0c;要访问这个路径下的文件&#xff0c;是会报错的 file_path rC:\Users\EDY\PJ-IPAStudio\designer\project 需要在前面添加 r 如果他是一个变量&#xff0c;如何对变量里的字符修改呢&…

0802功放2

功放要记一般的式子&#xff0c;而非最大的式子&#xff0c;因为总不能总开到最大音量上工作&#xff0c;而是在比较合适的音量上工作 运放的最大电压也是比电源低1~2V 饱和三极管的功率&#xff0c;电流越大&#xff0c;饱和压降越大&#xff1f;&#xff1f;&#xff1f;不…

C++青少年简明教程目录

C青少年简明教程目录 学习编程语言时&#xff0c;会遇到“开头难”和“深入难”的问题&#xff0c;这是许多编程学习者都会经历的普遍现象。这些问题并不是无法克服的&#xff0c;通过选择适合的教程、多做练习&#xff0c;可以逐步克服这些困难。根据我的学习和辅导经验&…

STM32G474的浮点数四则运算速度实测

一、FPU的启用 FPU 即浮点运算单元&#xff08;Float Point Unit&#xff09;。浮点运算&#xff0c;对于定点 CPU&#xff08;没有 FPU 的 CPU&#xff09;来说必须要按照 IEEE-754 标准的算法来完成运算&#xff0c;是相当耗费时间的。而对于有 FPU 的 CPU来说&#xff0c;浮…

oracle 窗口函数使用

Oracle 数据库中的窗口函数&#xff08;也称为分析函数或OLAP函数&#xff09;允许您对一组相关的行执行计算&#xff0c;而不是只针对单行。这些函数在数据分析中特别有用&#xff0c;因为它们允许您执行诸如计算移动平均值、累积总和、百分比排名等操作。 以下是一些常用的 …