解题思路:

①:从第一个数开始,每一个数依次与它后面一个数比较,比它后面的大,则交换

②:n个数,排序n-1趟(当序列逆序的时候)

③:若在一趟遍历中没有发生交换,即序列有序,则直接跳出循环,后面的趟数不再进行

④:如

1):序列:5  4  3  2  1 

2):第一趟排序结果为:4  3  2  1  5

3):第二趟排序结果为:3  2  1  4  5

4):第三趟排序结果为:2  1  3  4  5

5):第四趟排序结果为:1  2  3  4  5


知识补充:

1):冒泡排序的每一趟排序,元素都能到达最终位置

2):其排序趟数与初始序列的排列顺序有关

3):比较次数也与初始序列排列顺序有关

3):冒泡排序是一个稳定排序

4):最坏时间复杂度为o(n^2),最好为o(n)


参考代码:

#include<stdio.h>
#include<malloc.h>
void maoSort(int R[],int n);
void print_(int R[],int n);

int main()
{

    int n=4;/*序列长度为4*/
    /*为数组开辟空间*/
    int *R=(int *)malloc(n*sizeof(int));

     while(scanf("%d",&R[0])!=EOF)
     {
         /*输入数据*/
         for(int i=1;i<n;i++)
            scanf("%d",&R[i]);
            /*用冒泡排序*/
         maoSort(R,n);
         /*输出排序结果*/
         print_(R,n);
         free(R);
     }
     return 0;
}
/*==================================================*/
void maoSort(int R[],int n)
{
    int p=0;/*用于一次遍历中是否发生交换*/
    int term;
    for(int i=0;i<n-1;i++)
        {
            p=0;
            for(int j=0;j<n-i-1;j++)
            {
                if(R[j]>R[j+1])
                {
                    /*进行交换*/
                    term=R[j];
                    R[j]=R[j+1];
                    R[j+1]=term;
                    /*交换标志置1*/
                    p=1;
                }
            }
            /*如果没发生交换,说明序列有序,直接跳出循环*/
            if(p==0)
                break;
        }
}
/*==================================================*/
void print_(int R[],int n)
{
    for(int i=0;i<n-1;i++)
        printf("%d ",R[i]);
    printf("%d\n",R[n-1]);
}

别忘点赞哦-.-

点赞(12)
 

0.0分

41 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 14 条评论

zjj 10月前 回复TA
@蠢狗君 错了
略有磨损 1年前 回复TA
@OrangeChen 超时了吧(;´༎ຶД༎ຶ`)
略有磨损 1年前 回复TA
@OrangeChen 超时了吧(;´༎ຶД༎ຶ`)
OrangeChen 2年前 回复TA
#include<stdio.h>
void swap(int &a,int &b){
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
int main()
{
    int arr[4] = {0};
    for( int i = 0; i < 4 ; i++ ){
        scanf("%d",&arr[i]);
    }
    for (int i = 0; i < 4; i++) {
        for (int j = 1; j < 4; j++) {
            if(arr[j]<arr[j-1]){
                swap(arr[j],arr[j-1]);
            }
        }
    }

    for (int i = 0; i < 4; i++) {
        printf("%2d",arr[i]);
    }
    return 0;
}
为什么我这个是错的!!测试用例没毛病啊
L 2年前 回复TA
@小牛 sort好像在C里用不了吧
wdgwthw 2年前 回复TA
@小牛 直接用堆不香吗?
小牛 2年前 回复TA
直接用sort不香吗?
菜就多刷题 2年前 回复TA
@菜就多刷题 第一个for多了个分号
菜就多刷题 2年前 回复TA
#include<stdio.h>
int main()
{ 
int a[4];
int i,j,t;
	for(i=0;i<4;i++);
	{
		scanf("%d",&a[i]);
	
	}
for(i=0;i<4;i++)
{
	printf("%d\n",a[i]);
	
	
}
	for(i=0;i<3;i++)
	{
		for(j=0;j<3-i;j++)
		{
			if(a[j]>a[j+1])
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		
			
		}
	}
for(i=0;i<4;i++)
{
	printf("%d ",a[i]);
	
	
}
	return 0;
}
这个为什么输出都是错的啊!
哈哈 3年前 回复TA
牛啊