基础排序算法
Posted majorin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础排序算法相关的知识,希望对你有一定的参考价值。
排序算法(一)
计数排序
计数排序应该是最简单的排序算法了吧。
基本思想
计数排序运用了桶排序的思想,于是我们就现来讲讲桶排序:
(第一次画图,经验不足,请谅解)
桶排序的思想用语言来表述就是:
将数按值的大小放进几个表示数的范围的桶中,在每个桶中风别再做排序,最后从前向后合并。
但是,桶排序只是将原问题分解,变成小问题,再解决,实际上它是一种思想,一种将问题简化的方法。
在桶中将序列有序化就应该用更具体的算法了。
而计数排序就是桶大小为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]<<" ";
总结
对于以上排序因为其过大的时间复杂度或者空间复杂度,造成其对使用的影响比较大,所以用处不大,
但是这些算法是更加高效的排序算法的基础,而且对于培养我们的思维非常有好处。
下一节,会讲运用了递归和分治思想的快速排序和归并排序。
以上是关于基础排序算法的主要内容,如果未能解决你的问题,请参考以下文章