<补档>化身AD秒切排序问题

本文回顾了在30天C++学习中关于数据排序的内容,介绍了冒泡排序、STL中的sort函数以及选择排序、插入排序和希尔排序的实现过程,强调了sort函数的实用性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#今天上专业课,给我头都弄大了,知识点又碎又杂,22点刚下课,弄得整个人晕乎乎的,实在是没法写DAY6的任务了,那我就发个补档排序问题的文章吧!

我们在DAY3挑战30天C艹基本入门(DAY3--数据排序)-CSDN博客

数据排序里面主要介绍了,冒泡排序和STL里面的sort函数。

我们在这里补档一下其他的排序方法:

选择排序

如图,选择排序相比我们的冒泡排序在时间上更加优化了一点,我们并不是直接进行比较,而是将我们第一个元素设为最小值,在后面与每一个元素进行比较,然后有选择地比较。这样可以节约我们比较的时间和成本。比冒泡排序更加优化了一点。

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

我们这里将min设置为数组的角标,这样最后一步我们直接swap交换即可啦。

选择排序也是很EZ的,直接切了。

插入排序

可以看这个图,我们将第一个元素默认为有序区,然后我们将后面的元素视为无序区。

然后将第一个元素与后面对比,我们这里是从小到大排序,可以看到30,40都比20大

所以将30,40都视为有序区,然后之后继续对比,我们可以看到10,比前三个元素都小,我们要进行的操作就是将20,30,40整体向后移动一位,但是如果这样的话,我们10的位置就被占了,所以我们要设置一个temp=10来转化,将他设置为第一位。

这样来说的话所有情况我们都有考虑到,之后就进行循环到最后一位就好啦。

思路有了,那我们代码也就很轻松能写出来啦。

void mySort::InsertSort(vector<int>&vec)
{
	for(int j=1;j<=vec.size()-1;j++)//构造无序区 
		for(int i=0;i<j;i++)//构造有序区 
			if(vec[j]<vec[i]){
				int temp=vec[j];
				for(int k=j-1;k>=i;k--)
				{
					vec[k+1]=vec[k];
				}
				vec[i]=temp;
				break;
			}
}

希尔排序

希尔排序是针对直接插入排序的改进版本。

像这样操作,我们一直到最后全排列成功之后,我们就可以得到一个递增序列,这样的操作,时间复杂度会大大降低。

仔细观察,我们可以发现希尔排序其实就是高阶版的快速插入排序,我们同样写代码时候要进行有序区和无序区。

我们来欣赏一下代码部分:

void mySort::ShellInsert(vector<int>&vec,int start,int gap)
{
	for(int j=start+gap;j<=vec.size()-1;j+=gap){//构造无序区 
		for(int i=start;i<j;i+=gap){//构造有序区 
			if(vec[j]<vec[i]){
				int temp=vec[j];
				for(int k=j-gap;k>=i;k-=gap){
					vec[k+1]=vec[k]; 
				}
				vec[i]=temp;
				break;
			}
		}
	}
}

到此为止,我们的四大排序就算学完啦。

可以浅浅的告一段落啦,实际应用起来的时候我们会发现sort函数还是最方便的,嘿嘿,当然也是最简单的,时间复杂度也不是很大。

 

 

明天一定把DAY6发布了,今天课是真的多,还得难度大,给我快上抑郁了/(ㄒoㄒ)/~~。

(感谢各位ADC们的支持啦,谢谢大家)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值