码迷,mamicode.com
首页 > 编程语言 > 详细

基础排序算法

时间:2020-01-22 14:46:16      阅读:100      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!