C语言实现12种排序算法

news2025/2/5 5:10:57

1.冒泡排序

思路:比较相邻的两个数字,如果前一个数字大,那么就交换两个数字,直到有序。

  • 时间复杂度:O(n^2),
  • 稳定性:这是一种稳定的算法。
    代码实现:
void bubble_sort(int arr[],size_t len){
	size_t i,j;
	for(i=0;i<len;i++){	
		bool hasSwap = false;		//优化,判断数组是否已经有序,如果有序可以提前退出循环
		for(j=1;j<len-i;j++){		//这里j<len-i是因为最后面的肯定都是最大的,不需要多进行比较
			if(arr[j-1]>arr[j]){	//如果前一个比后一个大
				swap(&arr[j-1],&arr[j]);	//交换两个数据
				hasSwap = true;
			}	
		}
		if(!hasSwap){
			break;	
		}
	}
}

2.插入排序

思路:把一个数字插入一个有序的序列中,使之仍然保持有序,如对于需要我们进行排序的数组,我们可以使它的前i个数字有序,然后再插入i+1个数字,插入到合适的位置使之仍然保持有序,直到所有的数字有序。

  • 时间复杂度:O(n^2)
  • 稳定性:稳定的算法
    代码实现:
void insert_sort(int arr[],int len)
{
	int i,j;
	for(i=1;i<len;i++)
    {
		int key = arr[i]; //记录当前需要插入的数据
		for(j= i-1;i>=0&&arr[j]>key;j--)
        {	//找到插入的位置
			arr[j+1] = arr[j]; //把需要插入的元素后面的元素往后移
		}
		arr[j+1] = key;	//插入该元素
	}
}

3.折半插入排序

思路:本质上是插入排序,但是通过半分查找法找到插入的位置,让效率稍微快一点。

  • 时间复杂度:O(n^2),
  • 稳定性:稳定的算法。
    代码实现:
void half_insert_sort(int arr[],int len)
{
	int i,j;
	for(i=1;i<len;i++)
    {
		int key = arr[i];
		int left = 0;
		int right = i-1;
		while(left<=right)
        {	//半分查找找到插入的位置
			int mid = (left+right)/2;
			if(key<arr[mid])
            {
				right = mid-1;	
			}
            else
            {
				left = mid+1;	
			}	
		}
		for(j=i-1;j>=left;j--)
        {		//把后面的元素往后移
			arr[j+1]=arr[j];	
		}
		arr[j+1] = key;	//插入元素
	}
}

4.希尔排序

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

  • 时间复杂度:O(n^1.3) ,算法效率上大大提高 。
  • 稳定性:不稳定的算法。
  • 代码实现
void shell_sort(int arr[],int len)
{	//本质上也是一种插入排序,避免了大量数据的移动,在每一组排序过后,每个数据已经到了大致的位置。
	int i,j;
	int step=0;
	for(step = len/2;step>=1;step=step/2)
    {	//分组  分为step组,对每组的元素进行插入排序
		for(i=step;i<len;i++)
        {
			int key = arr[i];
			for(j=i-step;j>=0&&arr[j]>key;j=j-step)
            {
				arr[j+step] = arr[j];	
			}	
			arr[j+step] = key;
		}
	}
}

5.选择排序

思路:通过循环找到最大值所在的位置,然后把最大值和最后一个元素进行交换,通过循环直到所有的数据有序。

  • 时间复杂度:O(n^2)
  • 稳定性:不稳定的算法
    代码实现:
void select_sort(int arr[],size_t len)
{
	size_t i,j;
	for(i=0;i<len-1;i++)
    {
		int max = 0; //最大值下标
		for(j=1;j<len-i;j++)
        {
			if(arr[max]<arr[j])
            {	//找到最大值的下标
				max = j;	
			}	
		}
		if(max!=j-1)
        {	
			swap(&arr[max],&arr[j-1]);	//把最后一个元素和最大值进行交换
		}
	}
}

6.鸡尾酒排序

思路:选择排序的一种改进,一次循环直接找到最大值和最小值的位置,把最大值和最后一个元素进行交换,最小值和最前一个元素进行交换,所以最外层的循环只需要执行len/2次即可

  • 时间复杂度:O(n^2)
  • 稳定性:不稳定的算法
    代码实现:
void cocktail_sort(int arr[],size_t len)
{
	size_t i,j;
	for(i=0;i<len/2;i++)
    {
		int max = i;	//最大值下标
		int min = i;	//最小值下标
		for(j=i+1;j<len-i;j++)
        {
			if(arr[max]<arr[j])
            {	//找到最大值下标
				max = j;	
			}	
			if(arr[min]>arr[j])
            {	//找到最小值下标
				min = j;	
			}
		}
		if(max!=j-1)
        {
			swap(&arr[max],&arr[j-1]);		//交换最大值和未进行排序的最后一个元素
		}
		if(min == j-1)
        {	//如果最小值在未进行排序的最后一个位置,那么经过最大值的交换,已经交换到了最大值所在的位置
			min = max;		//把最小值的坐标进行改变
		}
		if(min!=i)
        {
			swap(&arr[i],&arr[min]);	//交换最小值和未进行排序的最前的元素
		}
	}
}

7.堆排序

思路:把数据进行大堆化,然后依次交换堆顶(最大值)和最后一个元素,在使堆顶重新大堆化,最后循环过后数组便有序。
最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
创建最大堆(Build Max Heap):将堆中的所有数据重新排序
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

  • 时间复杂度:O(nlgn)
  • 稳定性:不稳定的算法
    代码实现:
void re_heap(int arr[],size_t index,size_t len)
{
	size_t child = 2*index+1;	//左节点坐标
	int key = arr[index];	//当前节点值
	while(child<len)
    {
		if(child+1<len&&arr[child]<arr[child+1])
        {	//如果右节点存在且右节点的值比左节点大,那就child记录较大字节点的坐标
			child++;	
		}	
		if(arr[child]>key)
        {	//如果子节点的值比根节点的值大
			arr[index] = arr[child];	//改变根节点的值
		}
        else
        {
			break;	
		}
		index = child;
		child = 2*index+1;
	}
	arr[index] = key;		//插入记录好的值
}
void heap_sort(int arr[],size_t len)
{
	int i;
	for(i=len/2;i>=0;i--)
    {
		re_heap(arr,i,len);		//对第i个根节点进行大堆化
	}
	for(i=len-1;i>0;i--)
    {
		swap(&arr[0],&arr[i]);	//交换第一个和最后一个元素
		re_heap(arr,0,i);	//对第一个元素进行大堆化
	}
}

8.快速排序

思路:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
过程:

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

  • 时间复杂度:O(nlog2n)
  • 稳定性:不稳定的算法
  • 代码实现:
void quick_sort(int arr[],size_t left,size_t right)
{
	if(left>=right)
    {	//如果只有一个元素,那就是有序的,返回
		return;	
	}
	int i = left;
	int j = right;
	int key = arr[left];	//基准值
	while(i<j)
    {	//找到基准值的位置,使得基准值右边的元素都比基准值大,左边的元素都比基准值小
		while(i<j&&arr[j]>=key)
        {	//从右边找一个比基准值小的数,
			--j;
		}
		arr[i] = arr[j];//把这个值放到基准值的位置处
		while(i<j&&arr[i]<=key)
        {	//从左边找一个比基准值大的数
			++i;	
		}
		arr[j] = arr[i];		//把这个元素放到j的位置
	}
	arr[i] = key;
	if(i-left>1)	//元素个数至少两个才进行递归调用,这样可以少一次递归
		quick_sort(arr,left,i-1);	//对基准值左边的元素进行排序
	if(right-i>1)
		quick_sort(arr,i+1,right);	//对基准值右边的元素进行排序
}

9.归并排序

思路:对于两个有序的子序列,可以把它们合并在一起,变成一个新的完全有序的序列,因此归并排序和快排差不多,都是递归的进行。

  • 时间复杂度:O(nlog2n)
  • 稳定性:稳定的算法
    代码实现:
void merge(int arr[],int left,int right)
{
	int i,j,k;
	int mid = (left+right)/2;
	int len = mid-left+1;
	int *temp = malloc(sizeof(arr[0])*len);
	for(i=0;i<len;i++)
    {
		temp[i] = arr[i+left];	//把这个数组的所有元素都复制到临时数组中
	}
	i=0,j=mid+1,k=left;
	while(i<len&&j<=right)
    {
		if(temp[i]<arr[j])
        {	//把临时数组的元素和 [mid+1,right]这部分的元素一个一个的进行比较,如果谁小,那么arr里就存放谁的元素
			arr[k++] = temp[i++];	
		}
        else
        {
			arr[k++] = arr[j++];	
		}
	}
	while(i<len)
    {	//如果temp这个数组的元素还没有全部遍历完,那就把temp后面的元素都复制到arr里面去,
	//因为arr[mid+1,right] 这部分的元素本来就是arr后面部分的有序的元素,所以如果arr[mid+1,right]这部分没有遍历完也没关系的,
		arr[k++] = temp[i++];	
	}
	free(temp);
}
void merge_sort(int arr[],int left,int right)
{
	if(left>=right)
    {	//如果只有一个元素说明这个序列有序,那就返回
		return;	
	}	
	int mid = (left+right)/2;	//对两个有序的数组进行排序,
	merge_sort(arr,left,mid);	//对[left,mid]这个区间的元素进行排序
	merge_sort(arr,mid+1,right);	//对[mid+1,right]这个区间内的元素进行排序
	merge(arr,left,right);  //这个序列的[left,mid]为有序的序列 [mid+1,right]也为有序的序列
}

10.计数排序

思路:这是一种基于比较的算法,我们用一个大数组来存放这些数据,这些数据在这个大数组中的表现形式是以这个大数组的下标存在的,比如57,60,42这三个数字进行排序,那么用一个大数组,这个大数组的arr[57] = 1,arr[60] = 1,arr[42] = 1,然后遍历这个大数组就行了。

  • 时间复杂度:O(n+k),其中这个k为数据的范围,所以计数排序最适合数据比较集中的数组排序。
  • 稳定性:稳定的算法
  • 代码实现:
void count_sort(int arr[],size_t len)
{
	int max = arr[0];	//最大值
	int min = arr[0];	//最小值
	size_t i;
	for(i=0;i<len;i++)
    {
		if(max<arr[i])
        {	//找到最大值
			max =arr[i];	
		}
		if(min > arr[i])
        {	//找到最小值
			min = arr[i];	
		}
	}
	int cnt = max-min+1;		//范围
	int *prr = malloc(cnt*sizeof(int));	//申请临时空间
	for(i=0;i<cnt;i++)
    {	//这个临时数组全部置0
		prr[i] = 0;	
	}
	for(i=0;i<len;i++)
    {	//对需要进行排序的序列进行遍历
		prr[arr[i]-min]++;		//让下标为(arr[i]-min)的临时大数组的值+1
	}
	size_t j=0;
	for(i=0;i<cnt;i++)
    {	//遍历这个临时数组
		while(prr[i])
        {	//如果这个数组下标为i的值不等于0
			arr[j++] = i+min;	//那就让需要进行排序的数组的值为i+min;
			--prr[i];
		}	
	}
	free(prr);		//释放掉申请的动态内存
}

11.桶排序

思路:工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。
这是一种以消耗大量空间来换取高效率的排序方式,

  • 时间复杂度:O(N+C),其中C=N*(logN-logM),M为桶的数量。所以对于桶排序,桶的数量越多,其排序效率越高。
  • 稳定性:稳定的算法

代码实现:
首先定义桶这个类型:

typedef struct Bucket
{
	int vect[100];	//其实这里使用链表更好,但是我比较懒,就懒得用链表了
	int cnt;	//当前桶内存放数据的个数
}Bucket;

void bucket_sort(int arr[],size_t len)
{
	int min = arr[0];
	int max = arr[0];
	size_t i;
	for(i=0;i<len;i++)
    {
		if(min>arr[i])
        {	//找到最小值
			min = arr[i];	
		}
		if(max<arr[i])
        {	//找到最大值
			max = arr[i];	
		}
	}
	int size = max-min+1;
	Bucket bucket[5] = {};	//其实桶可以动态规划,但为了方便我这里直接分为5个桶
	for(i=0;i<len;i++)
    {	//遍历待排序的数组,把每个元素放到相应的桶当中,
	//比如[0,200]之间的元素放到下标为0的桶中,[201,400]之间的元素放到下标为1的桶中..
	//以此类推,直到放完所有的数据
		int index = (arr[i]-min)/(size/5);	//用来判断当前元素arr[i]需要放到哪个桶当中
		bucket[index].vect[bucket[index].cnt++] = arr[i];
	}
	size_t j=0,k=0;
	for(i=0;i<5;i++)
    {	//对这五个桶进行遍历
		count_sort(bucket[i].vect,bucket[i].cnt);	//首先对这个桶内的元素进行排序,
		//这里可以调用其他排序方法,也可以递归调用当前排序方法,但是为了节省内存,我选择调用其他排序方法,
		for(j=0;j<bucket[i].cnt;j++)
        {
			arr[k++] = bucket[i].vect[j];	//对排序好的桶进行遍历,并且把里面的元素复制到arr中去	
		}
	}
}

12.基数排序

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

解法:

1.首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中;

2.接下来将这些桶子中的数值重新串接起来,接着再进行一次分配,这次是根据十位数来分配;

3.接下来将这些桶子中的数值重新串接起来,持续进行以上的动作直至最高位数为止。

  • 时间复杂度:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。
  • 稳定性:稳定的算法;

代码实现:
还是定义桶的类型:

typedef struct Bucket{
	int vect[100];	//同样的可以用链表
	int cnt;
}Bucket;

void base_sort(int arr[],size_t len)
{
	size_t i;
	Bucket bucket[10] = {};	//十个桶
	int max = arr[0];
	for(i=0;i<len;i++)
    {	//寻找最大值,就可以判断最大值的位数
		if(arr[i]>max)
        {
			max = arr[i];	
		}	
	}
	size_t j,k;
	int num = 1;	//用来获得相应位数上的数字的关键参数,
	//比如要获得个位上的参数时num = 1;
	//获得十位上的数字时num = 10;
	//以此类推
	do{
		for(i=0;i<len;i++)
        {	//遍历待排序的数组,把每个元素放入相应的桶中
		    //比如251,当获得个位上的数字时,251放到下标为1的桶当中
		    //当获得十位上的数字时,251放到下标为5的桶当中
		    //当获得百位上的数字时,251放到下标为2的桶当中
		    //当获得千位上的数字时,251放到下标为0的桶当中
		    //以此类推
			int index = arr[i]/num%10;	//获得相应位数上的数字
			bucket[index].vect[bucket[index].cnt++] = arr[i];	//把这个数字放到相应的桶中
		}
		k=0;
		for(i=0;i<10;i++)
        {
			for(j=0;j<bucket[i].cnt;j++)
            {
				arr[k++] = bucket[i].vect[j];	//把这些桶按顺序依次遍历,
				//把桶中的元素重新放回arr当中
			}	
			bucket[i].cnt = 0;	//记得让桶中的cnt变为0,方便下一次存放
		}
		num*=10;	//num*10
	}while(max/=10);//循环条件
}

=========以上内容来自:用C语言完整实现12种排序方法_c语言快速排序解决排序问题-CSDN博客============

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

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

相关文章

java-JUC并发编程学习笔记03(尚硅谷)

线程间通信 例子&#xff1a; 对一个值1 -1交替完成&#xff0c;a的值就是1 b的值就是0 这个过程就是线程间通信 Synchronized实现&#xff1a; 虚假唤醒问题&#xff1a; 我们再添加两个线程。 我们发现我们的结果就不对了。 我们只需要使用while即可。 我们线程通信的最后一…

【Vue.js设计与实现】第一篇:框架设计概览-阅读笔记(完结)

从高层设计的角度去探讨框架需要关注的问题。 参考&#xff1a;速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.…

blender 画笔的衰成曲线Falloff Curve

Blender画笔是用来在雕刻模式或绘画模式下对物体进行修改的工具。画笔有不同的类型和设置&#xff0c;可以影响画笔的效果和外观。你提到的选项是画笔的衰减曲线&#xff08;Falloff Curve&#xff09;的预设&#xff0c;它们决定了画笔的强度如何随着距离中心的距离而变化。 …

32OLED中断系统&对射式红外计数&旋转编码计数

目录 一.程序调试方式 二.OLED简介 三. 中断系统 四.代码实现 (1)对射式红外计数 &#xff08;2&#xff09;旋转编码计数 一.程序调试方式 二.OLED简介 stm32引脚上电后&#xff0c;如果不初始化&#xff0c;默认是浮空输入的模式&#xff0c;在这个模式下引脚不会输出电平…

免费版XShell7下载安装

1.下载地址 家庭/学校免费 - NetSarang Websitehttps://www.xshell.com/zh/free-for-home-school/ 不同时期下载&#xff0c;版本会有不同&#xff0c;实时下载即可。 2.安装 Xshell和Xftp都要安装&#xff0c;点击下一步&#xff0c;直至安装完成。 3.邮箱注册&#xff0c;免…

Redis核心技术与实战【学习笔记】 - 16.Redis 缓存异常:缓存和数据库不一致

概述 只要使用 Redis 缓存&#xff0c;就必须面对缓存和数据库的一致性问题。 重要的是&#xff0c;如果数据不一致&#xff0c;那么业务应用从缓存中读取的数据就不是最新数据&#xff0c;这会导致严重的问题。比如说&#xff0c;我们把电商商品的库存信息缓存在 Redis 中&am…

【网站项目】065健康综合咨询问诊平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python入门到精通(七)——Python文件操作

Python文件操作 一、文件的编码 二、文件的读取 1、操作汇总 2、model 常用的三种基础访问模式 三、文件的写入 四、文件的追加 五、综合案例 一、文件的编码 1、什么是编码&#xff1f; 编码就是一种规则集合&#xff0c;记录了内容和二进制间进行相互转换的逻辑。编…

合约短线高胜率策略-扭转乾坤指标使用说明

扭转乾坤指标使用说明 行情判断 双绿线 多趋势双红线 空趋势大绿线 小红线 多震荡大红线 小绿线 空震荡 进场条件 趋势行情进场 多趋势 多信号 底金叉 做多空趋势 空信号 顶死叉 做空 震荡行情进场 多震荡 多信号 底金叉 做多多震荡 空信号 顶死叉 做空空…

带你玩转股票的价值投资,上市公司典型案例分析

一、教程描述 上市企业&#xff0c;一般是新经济的典型代表&#xff0c;它的变化最能折射出新的商业模式及未来的产业机会。无论你是企业管理层、新兴创业者&#xff0c;还是职场精英及在校学生&#xff0c;都可以从上市公司的演变规律中&#xff0c;找到自己的职业晋升路径和…

LNMP环境搭建动态网站

一、环境准备 服务器&#xff1a;openEuler 22.03 Linux IPV4 &#xff1a;192.168.110.144/24 网页服务器&#xff1a;Nginx1.21.0 数据库&#xff1a;MySQL 8.0.36 PHP&#xff1a;8.0.30 1.安装软件 [rootnode3 ~]# yum install php-mysqlnd php php-gd php-fpm php-xml -y…

运维SRE-02 正则表达式、grep

1.特殊符号补充 1.1位置相关的特殊符号 . 当前目录 .. 当前目录的上级目录 ~ 当前用户家目录 / 根目录 cd - 返回上次所在目录1.2熟练掌握 # 注释符号,root命令提示符 | 管道符号.1.3了解其他特殊符号 $ 取值(取出变量的值),普通用户的提示符 ! % ^ & * (){} [] ; ? \…

git使用以及工作中开发流程

Git是当前最先进、最主流的分布式版本控制系统&#xff0c;免费、开源。 主要概念&#xff1a; 基本流程&#xff1a; 命令&#xff1a; git commit -a # 省略了add到暂存区的步骤&#xff0c;直接提交工作区的修改内容到版本库&#xff0c;不包括新增的文件。git fetc…

Python之PySpark简单应用

文章目录 一、介绍1.准备工作2. 创建SparkSession对象&#xff1a;3. 读取数据&#xff1a;4. 数据处理与分析&#xff1a;5. 停止SparkSession&#xff1a; 二、示例1.读取解析csv数据2.解析计算序列数据map\flatmap 三、问题总结1.代码问题2.配置问题 一、介绍 PySpark是Apa…

【Linux-常用命令】Linux 常用命令大全

【Linux-常用命令】Linux 常用命令大全 1&#xff09;文件管理1.1.目录操作1.2.vim 操作1.3.打包压缩相关命令1.4.Linux 管道1.5.Linux 远程拷贝命令1.6.查看文件目录大小 2&#xff09;文件权限管理2.1.三种基本权限2.2.更改权限 3&#xff09;运行程序3.1.命令行运行3.2.后台…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种&#xff0c;包括&#xff1a;示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示&#xff0c;有&#xff1a;急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…

FileGDB文件地理数据库的大小和名称限制

FileGDB文件地理数据库的大小和名称限制 官方链接 文件地理数据库的大小和名称限制如下&#xff1a; 文件地理数据库的大小 - 无限制 表或要素类大小 - 1 TB&#xff08;默认值&#xff09;、4 GB 或 256 TB&#xff08;带关键字&#xff09; 要素类和表的数量 - 2,147,483,6…

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个&#xff0c;个人版的公共用例库&#xff0c;旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理&#xff0c;并以提高用例的复用率为目标&#xff0c;力求最大限度地减少重复劳动&#xff0c;提升…

数据结构-内部排序

简介 排序&#xff08;Sorting&#xff09;&#xff1a;将一个数据元素&#xff08;或记录&#xff09;的任意序列&#xff0c;重新排列成一个按关键字有序的序列 排序算法分为内部排序和外部排序 内部排序&#xff1a;在排序期间数据对象全部存放在内存的排序 外部排序&am…

【c++】取地址及const取地址操作符重载

1.const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改 我们来看看下面的代码 class Date { public:Date(int year, int month,…