标签:str line src 来讲 memset strong for can 超过
计数排序应该是最简单的排序算法了吧。
计数排序运用了桶排序的思想,于是我们就现来讲讲桶排序:
(第一次画图,经验不足,请谅解)
桶排序的思想用语言来表述就是:
将数按值的大小放进几个表示数的范围的桶中,在每个桶中风别再做排序,最后从前向后合并。
但是,桶排序只是将原问题分解,变成小问题,再解决,实际上它是一种思想,一种将问题简化的方法。
在桶中将序列有序化就应该用更具体的算法了。
而计数排序就是桶大小为1的桶排序。
memset(a,0,sizeof(a));
int n,sum;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{scanf("%d",&sum);a[sum]++;}
for(int i=1;i<=n;++i)
for(int j=1;j<=a[i];++j)
printf("%d ",i);
主要是快,即时间复杂度小,为\(O(n + a)\),其中a为数值范围,大概是最快的排序算法了
所占内存过大,即空间复杂度大,为\(O(a)\), a超过大概\(5*10^7\)就爆内存了
简单选择排序是最为自然的排序之一
将待排序序列中的最值取出,放入有序序列中
int i,j,n,mindex,mini=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>qu[i];
for(i=1;i<=n;i++)
{
mindex=999999;
for(j=i;j<=n;j++)
if(mindex>qu[j]) {mindex=qu[j];mini=j;}
swap(qu[i],qu[mini]);
}
for(i=1;i<=n;i++)
cout<<qu[i]<<" ";
很常见的排序算法,就是我们在理牌时,用的排序方式
将待排序序列中的第一个数取出,放入有序序列中相应的位置,
使有序序列依旧有序。
for (int i=2;i<=n;i++)
{
int now=qu[i],j;
for (j=i-1;j>=1;j--)
if(qu[j]>now) qu[j+1]=qu[j];
else break;
qu[j+1]=now;
}
for(int i=1;i<=n;i++)
cout<<qu[i]<<" ";
冒泡排序故名思义,排序的过程就像是泡泡上升
通过不断消除相邻的逆序数对使数到达相对有序的位置
int n,i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n-1;i++)
for(j=1;j<=n-i;j++)
if(a[j]>a[j+1]) swap(a[j],a[j+1]);
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
对于以上排序因为其过大的时间复杂度或者空间复杂度,造成其对使用的影响比较大,所以用处不大,
但是这些算法是更加高效的排序算法的基础,而且对于培养我们的思维非常有好处。
下一节,会讲运用了递归和分治思想的快速排序和归并排序。
标签:str line src 来讲 memset strong for can 超过
原文地址:https://www.cnblogs.com/majorin/p/12228480.html