问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言冒泡排序。

发布网友 发布时间:2022-04-24 12:02

我来回答

12个回答

热心网友 时间:2022-05-22 02:43

#include<stdio.h> 

void main() 

int a[10]; 

int i,j,t; 

printf("input 10 numbers:\n"); 

for(i=0;i<10;i++) 

scanf("%d",&a[i]);

for(j=0;j<9;j++) /*进行9次循环 实现9趟比较*/ 

for(i=0;i<9-j;i++) /*在每一趟中进行9-j次比较*/ 

if(a[i]>a[i+1]) /*相邻两个数比较,想降序只要改成a[i]<a[i+1]*/ 

t=a[i]; 

a[i]=a[i+1]; 

a[i+1]=t; 

printf("the sorted numbers:\n"); 

for(i=0;i<10;i++) 

printf(" %d",a[i]);


}

扩展资料:

冒泡排序算法的运作

1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。

2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。

3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。

4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。

简单的表示

#include <stdio.h>

void swap(int *i, int *j)

{

int temp = *i;

*i = *j;

*j = temp;

}

int main()

{

int a[10] = {2,1,4,5,6,9,7,8,7,7};

int i,j;

for (i = 0; i < 10; i++)

{

for (j = 9; j > i; j--)//从后往前冒泡

{

if (a[j] < a[j-1])

{

swap(&a[j], &a[j-1]);

}

}

}

for (i = 0; i < 10; i++)

{

printf("%d\n", a[i]);

}

return 0;

}

参考资料来源:冒泡排序-百度百科

热心网友 时间:2022-05-22 04:01

main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++)
{ for (i=0;i<10-j;i++)
if (a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}

--------------
冒泡算法
冒泡排序的算法分析与改进
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序

1、排序方法
将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
(1)初始
R[1..n]为无序区。

(2)第一趟扫描
从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。

(3)第二趟扫描
扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
最后,经过n-1 趟扫描可得到有序区R[1..n]
注意:
第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R上,结果是R[1..i]变为新的有序区。

2、冒泡排序过程示例
对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程

3、排序算法
(1)分析
因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

(2)具体算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
int i,j;
Boolean exchange; //交换标志
for(i=1;i<n;i++){ //最多做n-1趟排序
exchange=FALSE; //本趟排序开始前,交换标志应为假
for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
if(R[j+1].key<R[j].key){//交换记录
R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //发生了交换,故将交换标志置为真
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
} //endfor(外循环)
} //BubbleSort
4、算法分析
(1)算法的最好时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
Cmin=n-1
Mmin=0。
冒泡排序最好的时间复杂度为O(n)。

(2)算法的最坏时间复杂度
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
冒泡排序的最坏时间复杂度为O(n2)。

(3)算法的平均时间复杂度为O(n2)
虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。

(4)算法稳定性
冒泡排序是就地排序,且它是稳定的。

5、算法改进
上述的冒泡排序还可做如下的改进:
(1)记住最后一次交换发生位置lastExchange的冒泡排序
在每趟扫描中,记住最后一次交换发生的位置lastExchange,(该位置之前的相邻记录均已有序)。下一趟排序开始时,R[1..lastExchange-1]是有序区,R[lastExchange..n]是无序区。这样,一趟排序可能使当前有序区扩充多个记录,从而减少排序的趟数。具体算法【参见习题】。

(2) 改变扫描方向的冒泡排序
①冒泡排序的不对称性
能一趟扫描完成排序的情况:
只有最轻的气泡位于R[n]的位置,其余的气泡均已排好序,那么也只需一趟扫描就可以完成排序。
【例】对初始关键字序列12,18,42,44,45,67,94,10就仅需一趟扫描。
需要n-1趟扫描完成排序情况:
当只有最重的气泡位于R[1]的位置,其余的气泡均已排好序时,则仍需做n-1趟扫描才能完成排序。
【例】对初始关键字序列:94,10,12,18,42,44,45,67就需七趟扫描。

②造成不对称性的原因
每趟扫描仅能使最重气泡"下沉"一个位置,因此使位于顶端的最重气泡下沉到底部时,需做n-1趟扫描。

③改进不对称性的方法
在排序过程中交替改变扫描方向,可改进不对称性

复制过来的!

热心网友 时间:2022-05-22 05:36

//以下以四个数字的给举例,便于理解;
#include <stdio.h>
main()
{
int i; //定义i变量,i代表外层for循环--比较轮数;
int k; //定义k变量,k代表内层for循环--比较次数;
int t; //定义t变量,t代表临时变量,临时存放比较的结果中较大的数字,通过赋值的方式切换数字的排序;
int a[] = {30,3,6,10}; //定义数组,数组是本次要排序的数字组合;注意此处数组中一共4个数字所以 理论上是 a[4]={30,3,6,10};
//初试化i=1;并判断i是否小于等于3; 如果符合条件 那么进入for循环;(4个数字,两两对比需要进行3轮对比,i就代表了轮数;i需要经过 1,2,3 三轮的赋值;i=4的时候会跳出for循环)
for(i=1; i<=3; i++){ 
//初试化k=0;并判断k是否小于等于3 -i; 如果符合条件 那么进入for循环;第一轮的时候数组一共4个数字所以需要对比3次;第二轮还有3个数字需要对比2次;第三轮仅剩2个数字需要对比1次;(特:当k=0的时候是第一次对比;k从0开始赋值是为了在for循环内当数组的键值使用;)
for(k=0; k<=3-i; k++){ 
//判断a[K] 的数字  是否 大于 a[K + 1 ] 的数字;假设当前是第一轮第一次对比那么a[K=0] = 30,a[K=0 + 1] = 3;
if(a[k] > a[k+1]){ 
t = a[k];  //对上一步判断结果进行进一步处理,因为a[K] > a[K + 1 ] , 所以把a[K] 赋值给临时变量以便于 后续把这个大的数字向后平移;
a[k] = a[k+1]; //a[K + 1 ]是比较结果中比较小的数字,所以需要向前靠,向前靠就是要赋值给 a[K];空出 a[K + 1 ]便于下一步接收 较大的数字  a[K];
a[k+1] = t;  //a[K + 1 ] 接收 较大的数字  a[K];
}
}
}
for(i=0; i<4; i++){//初试化i=0;并判断i是否小于4; 如果符合条件 那么进入for循环,i在for内做键值使用:
printf("第 %d个数字为:%d\n",i+1,a[i]);
}
}
/* 
运行结果如下:
第 1个数字为:3
第 2个数字为:6
第 3个数字为:10
第 4个数字为:30
*/

热心网友 时间:2022-05-22 07:27

本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
#include
#include
#include
void
bubble_sort(int
array[])
{
int
temp,i,j;
for(j=0;j<49;j++)
/*
是分号不是逗号*/
for(i=0;i<49-j;i++)
/*
是分号不是逗号,是i<49-j,因为j每加1,一个大数已经放到了数组最后,最后的数就不用再在下一个i循环中再考虑
*/
{
if(array[i]>array[i+1])
{
temp=array[i];
array[i]=array[i+1];
array[i+1]=temp;
}
}
}
int
main()
{
int
i,a[50];
printf("sheng
cheng
sui
ji
shu");
srand(time(0));
/*随机数种子*/
for(i=0;i<50;i++)
{
if(i%10==0)
printf("\n");
a[i]=rand()%50;
/*
产生的随机数赋值给a[]
*/
printf("%5d",a[i]);
/*
打印的是a[]不是rand()%50,如果这里写成printf("%5d",rand()%50);再次调用随机函数,值又有变化
*/
}
bubble_sort(a);
printf("\n\nThe
sequence
after
sort
is:\n");
for(i=0;i<50;i++)
{
if(i%10==0)
/*
是i不是1
*/
printf("\n");
printf("%5d",a[i]);
}
getch();
/*格式rand()%(m-n+1)+n;产生一个n->m区间的随机数*/
}

热心网友 时间:2022-05-22 09:35

#include<stdio.h>
void main()
{
int a[10];
int i,j,t;
printf("input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(j=0;j<9;j++) /*进行9次循环 实现9趟比较*/
for(i=0;i<9-j;i++) /*在每一趟中进行9-j次比较*/
if(a[i]>a[i+1]) /*相邻两个数比较,想降序只要改成a[i]<a[i+1]*/
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers:");
for(i=0;i<10;i++)
printf(" %d",a[i]);
}

热心网友 时间:2022-05-22 12:00

#include
<stdio.h>
int
main(void)
{
/*
此处添加你自己的代码
*/
int
num[10]={0};
int
t=0;
int
i=0,j=0;
for(i=0;i<10;i++)
{
scanf("%d",&num[i]);
}
/*开始冒泡排序*/
for(i=10;i>0;i--)
for(j=0;j<i-1;j++)
{
if(num[j]>num[j+1])
/*按从小到大*/
{
t
=
num[j+1];
num[j+1]
=num[j];
num[j]
=
t;
/*交换*/
}
}
for(i=0;i<10;i++)
/*排序后输出*/
printf("%d
",num[i]);
getch();
return
0;
}

热心网友 时间:2022-05-22 14:41

你的程序里排序时是按照大数存到低地址,小数存到高地址,输出时是先输出高地址,后输出低地址,所以输出的数是升序。而有错位是因为输出的格式是一个“%d\t”,未给定数值的位宽。即456占三个字符,而78是两个字符。

热心网友 时间:2022-05-22 17:39

这是优化后的算法,如果数组已有序,则没有执行到
tag=1;所以退出循环,避免做无用功

热心网友 时间:2022-05-22 21:27

#include <stdio.h>
int main()
{
int a,t,i,j,n[1000];
scanf("%d",&a);
for(i=1;i<=a;i++)
{
scanf("%d",&n[i]);
}
for(i=1;i<=a;i++)
{
for(j=1;j<=a-i;j++)
{
if(n[j]>n[j+1])
{
t=n[j];
n[j]=n[j+1];
n[j+1]=t;
}
}
}
for(i=1;i<=a;i++)
{
printf("%d ",n[i]);
}
return 0;
}

热心网友 时间:2022-05-23 01:32

网页链接

热心网友 时间:2022-05-23 05:53

可以在优酷里搜“C语言冒泡排序”视频,*老师讲的那个,思路清晰,不到五分钟就能看完,通俗易懂。我就是在视频上自己学会的

热心网友 时间:2022-05-23 10:31

冒泡排序的思想:

首先,从表头开始往后扫描数组,在扫描过程中逐对比较相领两个元素的大小。

若相邻两个元素中,前面的元素大于后面的元素,则将它们互换, 称之为清去了一个逆序。在扫描过程中,不断地将两相邻元素中的大者往后移动,最后就将数组中的最大者换到了表的最后,这正是数组中最大元素应有的位置。

然后,在剩下的数组元素中(n-1个元素)重复上面的过程,将次小元素放到倒数第2个位置。不断重复上述过程,直到剩下的数组元素为0为止,此时的数组就变为了有序。假设数组元素的个数为西,在最坏情况下需要的比较总次数为: (n-1)+(n- 2)...+2+1)- n(n-1)/2。

源代码如下

冒泡法排序:

#include <stdio.h>

int main ()

{

int a[10];

int i, j, t;

printf ("请输入十个数:\n");

for (i = 0; i < 10; i++)

{

printf ("a[%d]=", i+1);

scanf ("%d",&a[i]);

}

for (j = 0;j < 9; j++)

for (i = 0; i < 9 - j; i++)

if (a[i] > a[i+1])

{

t = a[i];

a[i] = a[i+1];

a[i+1] = t;

}

printf ("由小到大的顺序为:\n");

for (i = 0; i < 10; i++)

{

printf ("%d,",a[i]);

}

printf ("\n");

return 0;

运行结果

请输入十个数:

a[1]=7

a[2]=8

a[3]=9

a[4]=6

a[5]=5

a[6]=4

a[7]=1

a[8]=2

a[9]=3

a[10]=99

由小到大的顺序为:

1,2,3,4,5,6,7,8,9,99,

扩展资料:

冒泡排序算法的原理如下:

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3、针对所有的元素重复以上的步骤,除了最后一个。

4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

参考资料来源:百度百科-冒泡排序

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 C语言编程——冒泡排序法。要求:由主函数调用排序子函数,对n个整数进行从小到大的排序,谢了 C语言编程——冒泡排序法。要求:由主函数调用排序子函数,对n个整数进 ... C语言冒泡排序法是怎么排序的? c语言数组冒泡排序 C语言冒泡排序 c语言冒泡排序详解 C语言冒泡排序法是什么? 小炒黄牛肉有哪些好吃又操作简单的制作方法呢? 怎样做出经典的小炒黄牛肉? 香菜炒牛肉怎么做? CAD必备神器,源泉插件安装包怎样获取,源泉插件如何安装? WIN10,64位电脑在安装auto CAD 2016时一直提示缺少net.framework v2... 请大家介绍几个比较好的CAD插件,做土木建筑和钢结构用的 CAD2016的批量打印插件那个最好用?求推荐 cad连续标注的插件下载 cad增强标注哪里下载及安装 cad标准件图库插件免费下载 电脑上有cad的软件但是没有经典cad的插件怎么弄? cad是2016版本的建议下载哪种版本的海龙插件? 大学里打扫卫生的感悟1000字 关于C语言冒泡排序法要详解 关于C语言冒泡排序法要详解 C语言冒泡排序法? C语言冒泡排序法? C语言中冒泡排序法(又称起泡排序法)得具体程序 C语言中冒泡排序法(又称起泡排序法)得具体程序 C语言冒泡排序法的详细注释? C语言冒泡排序法的详细注释? 求关于c语言 冒泡排序法的讲解 求关于c语言 冒泡排序法的讲解 酸洗用的是什么 化学清洗为什么先碱洗后酸洗 精密铸造酸洗主要是洗什么啊.? 哪位大虾知道,硫酸酸洗和盐酸酸洗有何区别,对酸洗废 电镀生产线为什么要进行酸洗、电镀、清洗 电化学酸洗清理的方法有几种? 澳大利亚经纬度位置是多少? 澳大利亚的经纬度范围 高中化学的水洗和酸洗是什么意思 澳大利亚纬线范围在什么和什么之间?