原题链接:C语言训练-排序问题(1)
解题思路:
①:从第一个数开始,每一个数依次与它后面一个数比较,比它后面的大,则交换
②: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]);
}别忘点赞哦-.-
0.0分
41 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#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; } 为什么我这个是错的!!测试用例没毛病啊#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; } 这个为什么输出都是错的啊!