排序算法学习

为什么要学习排序算法? 为什么要学习排序算法? 根据统计,早起大型机CPU资源的四分之一都花在了数据排序上面。排序算法作为最基础的算法,各种操作系统、编程语言都提供了内置的实现。既然排序实现随处可见,我们为什么还要自己动手实现呢?虽然经典算法要动手写写加深印象的道理都懂,但直到最近才发现,每种排序算法里都“暗藏玄机”。排序算法看似简单,其实不同的算法中蕴涵着经典的算法策略。通过熟练掌握排序算法,就可以掌握基本的算法设计思想,包括暴力枚举法、时间空间置换、子问题的分治以及随机化。 1.选择排序:暴力搜索 1.1 “暴力”的定义 按 阅读详情

目录

一、排序算法的一些辅助函数

1、输出函数两个

2、两数交换函数

二、排序算法的分类

1、简单选择排序

2、冒泡排序

3、直接插入排序

4、希尔排序

三、总程序


一、排序算法的一些辅助函数

1、输出函数两个

//输出函数一(b站)
void print(int *arr)
{
	int i;
	for(i=0;i<maxsize;i++)
	{
		printf("%d ",arr[i]);
	}
	putchar('\n');
}
//输出函数二(大话)
void printD(int *a)
{
	int i;
	for(i=1;i<maxsize;i++)
	{
		printf("%d ",a[i]);
	}
	putchar('\n');
}

2、两数交换函数

//交换函数,作为辅助函数,用于数组中两数的交换
void swap(int *arr,int i,int j)//数组名,下标,下标
{
	int temp;
	if(!arr || i<0 || j<0)return;
	if(i==j)return;
	temp=arr[i];
	arr[i]=arr[j];
	arr[j]=temp;
}

二、排序算法的分类

1、简单选择排序

打擂台的方式,多次打擂台,每次选一个擂主,剩余的作为挑战者上台比大小,最后确定每次打擂台的擂主,形成从小到大的排序或者从大到小的排序

代码:

void choice(int *arr)
{
	int i,j;
	if(!arr || maxsize<=1)return;
	for(i=0;i<maxsize-1;i++)//每轮擂主的编号i,最后一个不用做擂主,没有挑战者了 
	{
		for(j=i+1;j<maxsize;j++)//擂台战,挑战者j标号
		{
			if(arr[i]>arr[j])
			{
				swap(arr,i,j);
			}
		}
	}	
}

2、冒泡排序

每一轮冒泡都是将一个最值固定,同时对数据有一定的排序

下面的两个程序都可以运行,主要是对数组越界的问题处理不一样,数组的越界问题(j+1)要特别注意

void bubbling(int *arr)
{
	int i,j;
	if(!arr || maxsize<=1)return;
	for(i=1;i<maxsize;i++)//需要冒泡maxsize-1轮,即1至maxsize
	{
		for(j=0;j<maxsize-i;j++)//后面的排好序了不用比了
		{
			if(arr[j]<arr[j+1])
				swap(arr,j,j+1);
		}
	}
}

或者

void bubbling(int *arr)
{
	int i,j;
	if(!arr || maxsize<=1)return;
	for(i=0;i<maxsize-1;i++)//需要冒泡maxsize-1轮,即1至maxsize
	{
		for(j=0;j<maxsize-i-1;j++)//后面的排好序了不用比了
		{
			if(arr[j]<arr[j+1])
				swap(arr,j,j+1);
		}
	}
}

3、直接插入排序

分为两种,其实殊途同归,只是key的选择不一样

//插入排序(b站方法)
void inter(int *arr)
{
	int i=0,j=0,key=0;
	if(!arr || maxsize<=1)return;
	for(i=1;i<maxsize;i++)//默认数组下标0的数是有序的
	{
		key=arr[i];//先保存无序要插入的数
		for(j=i;j>=0;j--)//实则就是从后往前的打擂台排序
		{
			if(key<arr[j-1])swap(arr,j,j-1);
			else break;
		}
	}	
}
//插入排序(大话数据),先对数组处理,数组下标为0的元素不存放数据,用于哨兵位置
//思路与b站的方法雷同,但是用数组的头元素作为key
void Inter(int *a)
{
	int i=0,j=0;
	if(!a || maxsize<=1)return;
	for(i=2;i<maxsize;i++)//默认数组下标为1的元素有序,无序要待插入的元素从2开始
	{
		if(a[i]<a[i-1])
		{
			a[0]=a[i];//保存
			for(j=i-1;a[0]<a[j];j--)
			{
				a[j+1]=a[j];//后移
			}
			a[j+1]=a[0];
		}
	}
}

4、希尔排序

分为两种,其实殊途同归,只是key的选择不一样

//希尔排序(b站版本)
void Shellsort(int *arr)
{
	int inc;//增量
	int i,j;//i是无序要插入的,j是指针
	int key;
	for(inc=maxsize/2;inc>0;inc/=2)
	{
		for(i=inc;i<maxsize;i++)
		{
			key=arr[i];
			for(j=i;(j-inc)>=0 && key<arr[j-inc];j=j-inc)//j-inc>=0是对j=j-inc的约束,防止数组在j=j-inc后使得arr[j-inc]越位,就是不能少于0
			{
				arr[j]=arr[j-inc];//移位的功能
			}
			arr[j]=key;
		}
	}
}
//希尔排序(大话版本)
void Shell_sort(int *a)
{
	int i,j;
	int inc;
	for(inc=maxsize/2;inc>0;inc=inc/2)
	{
		for(i=inc+1;i<maxsize;i++)
		{
			a[0]=a[i];
			for(j=i;j>=inc && a[0]<a[j-inc];j-=inc)
			{
				a[j]=a[j-inc];
			}
			a[j]=a[0];
		}
	}
}

三、总程序

#include<stdio.h>
#include<stdlib.h>
#define maxsize 9

//输出函数一(b站)
void print(int *arr)
{
	int i;
	for(i=0;i<maxsize;i++)
	{
		printf("%d ",arr[i]);
	}
	putchar('\n');
}
//输出函数二(大话)
void printD(int *a)
{
	int i;
	for(i=1;i<maxsize;i++)
	{
		printf("%d ",a[i]);
	}
	putchar('\n');
}

//交换函数,作为辅助函数,用于数组中两数的交换
void swap(int *arr,int i,int j)//数组名,下标,下标
{
	int temp;
	if(!arr || i<0 || j<0)return;
	if(i==j)return;
	temp=arr[i];
	arr[i]=arr[j];
	arr[j]=temp;
}

//选择排序
void choice(int *arr)
{
	int i,j;
	if(!arr || maxsize<=1)return;
	for(i=0;i<maxsize-1;i++)//从数组的0到下标的maxsize-1 
	{
		for(j=i+1;j<maxsize;j++)//擂台战,选一个擂主i,挑战者j多次比对
		{
			if(arr[i]>arr[j])
			{
				swap(arr,i,j);
			}
		}
	}	
}

//冒泡排序,从大到小
void bubbling(int *arr)
{
	int i,j;
	if(!arr || maxsize<=1)return;
	for(i=1;i<maxsize;i++)//需要冒泡maxsize-1轮,即1至maxsize
	{
		for(j=0;j<maxsize-i;j++)
		{
			if(arr[j]<arr[j+1])
				swap(arr,j,j+1);
		}
	}
}

//插入排序(b站方法)
void inter(int *arr)
{
	int i=0,j=0,key=0;
	if(!arr || maxsize<=1)return;
	for(i=1;i<maxsize;i++)//默认数组下标0的数是有序的
	{
		key=arr[i];//先保存无序要插入的数
		/*for(j=i;j>=0;j--)//方法一
		{
			if(key<arr[j-1])swap(arr,j,j-1);
			else break;
		}*/
		for(j=i;(j>=0 && key<arr[j-1]);j--)//方法二,要插入的数在前一个有序数的左边,那么就
		{
			arr[j]=arr[j-1];//将前一个有序数后移一位,循环后空出的位置就是真确的位置
		}
		arr[j]=key;//放入正确的位置
	}	
}

//插入排序(大话数据),先对数组处理,数组下标为0的元素不存放数据,用于哨兵位置
//思路与b站的方法雷同,但是用数组的头元素作为key
void Inter(int *a)
{
	int i=0,j=0;
	if(!a || maxsize<=1)return;
	for(i=2;i<maxsize;i++)//默认数组下标为1的元素有序,无序要待插入的元素从2开始
	{
		if(a[i]<a[i-1])
		{
			a[0]=a[i];//保存
			for(j=i-1;a[0]<a[j];j--)
			{
				a[j+1]=a[j];//后移
			}
			a[j+1]=a[0];
		}
	}
}

//希尔排序(b站版本)
void Shellsort(int *arr)
{
	int inc;//增量
	int i,j;//i是无序要插入的,j是指针
	int key;
	for(inc=maxsize/2;inc>0;inc/=2)
	{
		for(i=inc;i<maxsize;i++)
		{
			key=arr[i];
			for(j=i;(j-inc)>=0 && key<arr[j-inc];j=j-inc)//j-inc>=0是对j=j-inc的约束,防止数组在j=j-inc后使得arr[j-inc]越位,就是不能少于0
			{
				arr[j]=arr[j-inc];//移位的功能
			}
			arr[j]=key;
		}
	}
}

//希尔排序(大话版本)
void Shell_sort(int *a)
{
	int i,j;
	int inc;
	for(inc=maxsize/2;inc>0;inc=inc/2)
	{
		for(i=inc+1;i<maxsize;i++)
		{
			a[0]=a[i];
			for(j=i;j>=inc && a[0]<a[j-inc];j-=inc)
			{
				a[j]=a[j-inc];
			}
			a[j]=a[0];
		}
	}
}


//主函数
void main()
{
	int i;
	//int arr[maxsize]={0};
	int a[maxsize]={0,3,1,2,5,88,66,12,45};//大话使用*********************************************************************

	for(i=0;i<maxsize;i++)//取随机数
	{
		arr[i]=rand()%100;
	}
	printf("排序前:\n");
	print(arr);//调用输出函数
	putchar('\n');

	choice(arr);//调用选择排序函数
	bubbling(arr);//调用冒泡排序
	inter(arr);//调用插入排序(b站方法)
	Shellsort(arr);//调用希尔排序(b站方法)

	printf("排序后:\n");
	print(arr);//调用输出函数
	putchar('\n');

//*************************************************************************************************************
//因为大话的方法是先对数组做一些处理,所以要另外的方式
	//printf("排序前:\n");
	//printD(a);//调用输出函数
	//putchar('\n');

	//Inter(a);//调用插入排序(大话数据)
	//Shell_sort(a);//调用希尔排序(大话数据)

	//printf("排序后:\n");
	//printD(a);//调用输出函数
	//putchar('\n');

}


【排序算法】各种排序算法学习总结 常用排序算法的复杂度分析整理 具体分析如下:1 冒泡排序(BubbleSort)冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。步骤: (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。 (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元 阅读详情

相关推荐

学习排序算法,结合这个方法太容易理解了

排序是一个经典的问题,它以一定的顺序对一个数组或列表中的元素进行重新排序。而排序算法也是各有千秋,每个都有自身的优点和局限性。虽然这些算法平常根本就不用自己去编写,但作为一个有追求的程序员,还是要了解它们从不同角度解决排序问题的思想。 学习算法是枯燥的,那怎么高效的理解它的原理呢?显然,如果以动图的方式,生动形象的把算法排序的过程展示出来,非常有助于学习。visualgo.net就是一个可视化...

编程知识分享 3593

常用排序算法学习

本篇文章主要记录排序算法的学习过程,如有遗漏,还望提醒提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

weixin_43841761的博客 1584

数据结构与算法里排序算法的学习资源推荐

排序算法是数据处理和算法设计中的基础且关键的部分。掌握排序算法不仅有助于提高程序的运行效率,还能加深对算法设计和数据结构的理解。本文章的目的在于为想要学习排序算法的读者提供丰富、全面且有针对性的学习资源推荐。范围涵盖了从基础入门到高级进阶的各类学习资料,包括书籍、在线课程、技术博客、开发工具以及相关论文著作等。本文将按照以下结构展开:首先介绍排序算法的核心概念与联系,让读者对排序算法有一个基本的认识;接着推荐各类学习资源,包括书籍、在线课程、技术博客和网站等;

AI 算法实战派 730

数据结构学习之排序算法的学习

学习数据结构实现了一些简单的排序算法, 做个学习记录。 #include<iostream> #include<cstdlib> using namespace std; #define MAXSIZE 20 typedef struct { //设置了一个哨兵r[0];元素从r[1]开始存放 int r[MAXSIZE+1]; //定义SqList结构体,存放一个数组和数组的长度 int length; }SqList; void swap(SqLi

qq_46087622的博客 317

常见排序算法简介及编程学习

请注意,这里只提供了简单的代码示例,并没有处理一些特殊情况,例如重复元素或已经部分有序的数组。快速排序是一种高效的排序算法,它采用分治的思想,通过选择一个基准元素,将数组分成左右两个子数组,然后对子数组进行递归排序。归并排序是一种稳定的排序算法,它采用分治的思想,将数组递归地拆分成小的子数组,然后将子数组进行合并排序。冒泡排序是一种简单的排序算法,它通过依次比较相邻的元素并交换位置,将较大的元素逐渐“浮”到数组的末尾。选择排序是一种简单直观的排序算法,它通过每次选择最小的元素放置到已排序部分的末尾。

WqSmalltalk的博客 123

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

nnpersistent的博客 5057

学习排序算法简介

学习排序算法简介 学习排序(Learning to Rank, LTR)是一类基于机器学习方法的排序算法。 传统经典的模型,例如基于TFIDF特征的VSM模型,很难融入多种特征,也就是除了TFIDF特征之外,就无法融入其他种类的特征了。 而机器学习的方法很容易融合多种特征,而且有成熟深厚的理论基础,参数也是通过迭代计算出来的,有一套成熟理论来解决稀疏、过拟合等问题。 LTR方法大致可以分成三类: 1) Pointwise 单文档方法 2) Pairwise 文档对方法

bigfacesafdasgfewgf 4208

Etcd教程 — 第三章 Etcd集群动态发现、DNS发现

Etcd教程 — 第三章 Etcd集群动态发现、DNS发现

Mr_XiMu的博客 2820

自定义排序算法学习

自定义排序算法学习

学习代码 719

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 474

基于CNN网络的轴承故障诊断

内容参考:《基于卷积神经网络的轴承故障 诊断算法研究》–张伟 代码参考: https://github.com/AaronCosmos/wdcnn_bearning_fault_diagnosis 1 背景: 基于信号处理的特征提取+分类器的传统智能诊断算法,对专家经验要求高,设计耗时且不能保证通用性,已经不能满足机械大数据的要求。提出使用基于卷积神经网络智能诊断算法来自动完成特征提取以及故障识别。 1.1 挑战 机电产品故障诊断面临的挑战,有三大特点: (1)数据量大,专业分析人员的数量严重不足,仅依靠人

weixin_45679938的博客 7万+

五大排序算法学习

文章目录冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)快速排序(Quick Sort) https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 冒泡排序(Bubble Sort) 算法原理 冒泡排序的原理在于对无序表进行多趟比较交换,每趟包括多次两两相邻比较,并将逆序的数据项互换位置。最终,每趟对比完能将本趟的最大项就位,经过n-1趟比较,实

weixin_44507435的博客 596

用Spirent Test Center测试交换机Head of Line(HOL)Blocking

测试目的:设备执行拥塞控制,使非阻塞端口不受阻塞端口影响 预设条件:在RFC2889里按以下步骤设置,端口1和端口3同时向端口4发送数据包,端口1向端口2发送数据包 测试步骤:运行设置好的RFC2889 测试结果:所有frame size都显示没有Head of Line(HOL),即非阻塞端口不受阻塞端口所影响 ...

Yuna_的博客 1357

学习排序算法简单

学习排序算法简单          学习排序(Learning to Rank, LTR)是一类基于机器学习方法的排序算法。     传统经典的模型,比如基于TFIDF特征的VSM模型。非常难融入多种特征。也就是除了TFIDF特征之外。就无法融入其它种类的特征了。     而机器学习的方法非常easy融合多种特征,并且有成熟深厚的理论基础,參数也是通过迭代计算出来的...

weixin_34245082的博客 125

利用XGBoost实现短期电力负荷预测

本数据集为某地区2009年-2015年的用电负荷,时间片为每分钟这里我们定义了XGB模型作为实例,来进行模型训练,之后我们会对其使用网格搜索找到最优的参数。

优快云 精品推荐 4495

npm install failed如何办?

上网搜索,说是网络配置不太对。按照如下几步,保证解决问题。在运行npm install指令时,出现如下错误。

xiezhipu的博客 879

排序算法该怎么学习

以上是冒泡排序的具体思路分析,学习冒泡排序需要捋清楚其过程,主要是分析冒泡排序是怎么比较的。

wzm_c1386666的博客 136

第七天 Labview进阶(7.2 与汇川PLC通信)

运行环境: Labview 2020 Autoshop v4.10.1.1 该文档中包括Labview程序和汇川PLC程序,可以完美实现Labview与汇川PLC的通信。具体的使用教程可以参考本人的相关文章,讲解详尽,请尽情享用!

weixin_38637405的博客 3527

LambdaMart:基于Python的高效学习排序算法

LambdaMart:基于Python的高效学习排序算法 项目介绍 LambdaMART 是一个基于 Python 实现的高效学习排序算法,它是 LambdaRank 算法的扩展。该算法广泛用于搜索引擎、推荐系统等领域,用于提高检索结果的排序质量。LambdaMART 通过构建多棵回归树来优化排序任务,每棵树都是基于梯度提升树(Gradient Boosting Trees)的原理进行构建。Lam...

gitblog_01043的博客 1257

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

排序算法的学习和理解

周六参加孤尽老师的柚子班,有一个独特的环节:在纸上手写冒泡排序、插入排序、快速排序,要求15分钟写完,且把代码写到IDE里面能编辑通过且运行正确,正确一个算一分,结果现场21人能得分的只有4人,本人也是一分未得,感觉很羞愧????‍♂️。后面孤尽老师秀了一手:在txt文件编辑器中写快排,然后copy到IDE运行一把通过,赢得了在场阵阵掌声。孤尽老师本人跟大家说,他自己其实没有多少时间去记快排的代码(又要給我们准备讲课的内容,还有工作的事情),但是已经理解通透原理,所以手写出来不成问题。 ...

awocbb的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

排序算法学习01_算法基础介绍

算法基础介绍 学习目标:精通使用十大排序算法 排序算法 一、什么是排序算法 来自维基百科中的定义是这样的: 一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法。 二、排序算法需要遵循的原则 输出结果为递增序列(递增是针对所需的排序顺序而言) 输出结果是原输入的一种排列、或是重组 三、排序算法的几种分类方式 按照时间复杂度划分,依据列表(list)的大小(n) 对于一个排序算法: 最差性能:O(n^2) 最好性能:O(n lo

kkmigu的博客 278

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

基于元学习的搜索排序算法优化

传统搜索排序算法在面对复杂场景(如跨品类、新用户冷启动、实时流量波动)时,常因数据分布差异导致效果衰减。本文将揭示元学习(Meta Learning)如何赋予排序模型"学会学习"的能力,使其能快速适应不同搜索场景。我们将从技术原理、实现细节到真实业务落地,逐步解析这一前沿技术:用生活化比喻理解元学习本质,通过代码示例展示核心实现逻辑,结合电商搜索场景说明具体应用,并展望未来发展趋势。无论你是搜索算法工程师还是对AI自适应技术感兴趣的开发者,本文都将为你提供可落地的优化思路。

专注搜索引擎技术 477
上一篇: 树等的学习
下一篇: 算法-查找(顺序和二分)
甘甜的话梅
博客等级 码龄7年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值