#今天上专业课,给我头都弄大了,知识点又碎又杂,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们的支持啦,谢谢大家)