【ACM算法】-- 排序篇 - 冒泡排序

在这里插入图片描述
如题:

我们可以选择多种排序算法,其中冒泡排序是最基本的,最基础的算法,在机试中,一般内存会给的比较大,所以我们完全可以达到一种,以空间换时间的状态(此处扯淡了,冒泡排序并不涉及以空间换时间,其本身的时间运行是比较缓慢的)

时间要求是一秒钟,所以当复杂度超过一千万的时候,就会超时,而,冒泡排序的复杂度是 O(n^2),题中给出,n 是 <= 100 的,所以复杂度在 1 万,所以不会超时

代码如下:

#include<stdio.h>
int main(){
    int n;//定义n,用来接收题中所说的 n
    int buf[100];//定义一个数组,用来接收 0~100 个数字
    while(scanf("%d",&n)!=EOF)//输入 n 
    {
        for(int i=0 ;i<n;i++){
            scanf("%d",&buf[i]);//读取每一个待排序数字
        }
        /* 排序开始 */
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i-1;j++){
                if(buf[j]>buf[j+1]){
                    int temp=buf[j];
                    buf[j]=buf[j+1];
                    buf[j+1]=temp;
                }
            }
        }
        /* 排序结束 */
        for(int i=0;i<n;i++){
            printf("%d ",buf[i]);//打印输出结果,题目要求,在每一个数字后面都输出一个 空格
        }
        printf("\n");//输出换行
    }
}

注意:

1>对于 scanf("%d",&n)!=EOF
scanf() 这个函数是有返回值的,它返回被输入函数成功赋值的变量的个数,如果输入已经到达结尾(输入文件到达末尾,或在命令台中输入 Ctrl^z ) scanf() 无法再为变量赋值,于是返回 EOF (end of file)
2>对于冒泡排序主体
冒泡排序的思想就是,比大小,并且 n 个数中每一个数都得比一次,这就对应于最外层循环,i 从 1~n ,此时,将关注点放到每一个数上,则这个函数,需要和其后面的数比大小,如果满足条件,则进行值交换
3>对于 j 的结束问题
在排序主体中,可以看待,buf[ j ] 是与 buf[ j+1 ]进行比较的,所以 j+1 要在待排序的数字序列中,每排一个数,则待排序数 -1 而外层 i 的值,就是已经被排序的个数 , 所以,表达式是: j + 1< n - i 即 j < n - i -1
4>整体思想
冒泡排序,是将满足条件的数沉没到待排序的底部,所以就相当于,每次 i 的自增,待排序数就像上冒一个泡,所以,j 的每次赋值都是 0 ,即每次排序,都是从头开始排,一直排到,待排序数的末尾

总结:
冒泡排序是 最简单的,基础的 排序,务必掌握。

发布了83 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42127861/article/details/89304281