冒泡排序

一、问题描述

对N个整数(数据由键盘输入)进行升序排列

二、问题分析:
对于N个数因其类型相同,我们可利用数组进行存储。冒泡排序是在两个相邻元素之间进行比较交换的过程将一个无序表变成有序表。冒泡排序的思想:首先,从表头开始往后扫描数组,在扫描过程中逐对比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去了一个逆序。在扫描过程中,不断地将两相邻元素中的大者往后移动,最后就将数组中的最大者换到了表的最后,这正是数组中最大元素应有的位置。然后,在剩下的数组元素中(n-1个元素)重复上面的过程,将次小元素放到倒数第2个位置。不断重复上述过程直到剩下的数组元素为0为止,此时的数组就变为了有序。假设数组元素的个数为,在最坏情况下需要的比较总次数为:((n-1)(n-2)...+2+1)=n(n-1)/2。

三、.算法设计:
冒泡排序的过程我们用示意图简单的表示,从整个排序过程中寻找规律,n个元素只需比较n-1次即可。假设一个数组中有7个元素,现在对这7个元素进行排序,只需比较6轮即可得到所要的有序序列。示意图中最后加粗的数字即为经过一轮交换位置固定的数字。示意图如下:

 数组名用a表示、数组下标用i表示,数组中相邻两个元素的下标可表示为alalj+1]或a[i-1]、a[]。在利用数组解决问题时需要注意数组下标不要越界。假如定义·个整形数组inta[n],则数组元素下标的取值范围是0~n-1,下标小于或者大于m-1都视为下标越界。如果相邻元素采用afi、ai+1]表示的话,则下标取值范围是0~-2,若采用ai-1]ai表示,下标取值范围则是1~n-1,因此读者在进行编程时一定要注数组下标越界的问题数组元素互换也是经常遇到的一类题型,一般这种情况我们需要借助一个中间变量力可以完成,对于许多初学者来说经常犯的一个错误是,对两个元素直接相互赋值,而不借助中间变量。我们先来看生活中的一个例子。在蓝墨水瓶中装有蓝墨水,红墨水瓶中装有红愚水,现在我们要把蓝墨水放到红墨水瓶中,红墨水放到蓝墨水瓶中。做法是先找一/白色空瓶(作用相当于程序中的中间变量),首先将蓝墨水倒入白色空瓶(t=ali]或tali+i]),接着将红墨水倒入蓝墨水瓶(a[i]=a[i+l] 或ali+l]=ai]),最后将白瓶中的蓝墨水倒入红墨水瓶(ali+1t或ali=t),经过这3步就完成了红墨水与蓝墨水的互换。如果不借助白空瓶,直接把蓝墨水倒入红墨水瓶,或把红墨水倒入蓝墨水瓶,这样必将破坏原来所存储的内容。

四、程序流程图

 

五、代码实现

#include<stdio.h>
#define N 10
main()
{
int i,j,a[N],t,count=0;
printf("请为数组元素赋初值:\n");
for(i=0;i<=N;i++);
scanf("%d",&a[N]);
for(i=0;i<N-1;i++)
for(j=0;j<=N-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
printf("经过交换后的数组元素为:\n");
for(i=0;i<N;i++)
{
count++;
printf("%d",a[i]);
if(count%5==0)
printf("\n");
}
printf("\n");
}

 

posted @ 2023-04-24 09:07  jais  阅读(18)  评论(0编辑  收藏  举报