首页 > 其他分享 >冒泡排序

冒泡排序

时间:2023-04-21 23:13:22浏览次数:32  
标签:下标 蓝墨水 元素 冒泡排序 墨水瓶 数组

1,问题描述:
对N个整数(数据由键盘输入)进行升序排列。

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

3.算法设计:
冒泡排序的过程我们用示意图简单的表示,从整个排序过程中寻找规律,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步就完成了红墨水与蓝墨水的互换。如果不借助白空瓶,直接把蓝墨水倒入红墨水瓶,或把红墨水倒入蓝墨水瓶,这样必将破坏原来所存储的内容。

4.源代码:

#include<stdio.h>
#define N 10
int main()
{
int i, j, a[N], t, count = 0;
printf("请为数组元素赋初值:\n");
for (i = 0; i <= N - 1; i++)
scanf("%d", &a[i]);
for (i = 1; i <= N; 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");
}

5.流程图:

 

标签:下标,蓝墨水,元素,冒泡排序,墨水瓶,数组
From: https://www.cnblogs.com/tianpeisen/p/17342141.html

相关文章

  • 指针配合数组和函数案例(冒泡排序)
    #include<iostream>usingnamespacestd;voidmaopao(int*arr,intlen){ for(inti=0;i<len-1;i++) { for(intj=0;j<len-i-1;j++) { if(arr[j]>arr[j+1]) { inttemp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }}voidprintf(int*arr,in......
  • 冒泡排序
    问题:对N个整数,由键盘输入,进行升序排序。设计:首先定义一个数组,可以盛放n个元素,利用for循环输入数组中每个元素的值,定义for循环j=1,j<=n-1,j++经过举例,需要n-1个轮回,j的for循环中嵌套i的for循环,i=0;i<n-j,i++经过举例,每次比较的次数为n-j次,因为j次轮回时,最后的j个元素就已经是按顺序......
  • 冒泡排序
    问题描述:键入N个整数进行升序排序。 1.第一行输入N表示输入的数字的个数  2.用循环输入数字;  3.定义i控制比较次数,定义j控制每次比较的次数;  4.如果后面的数小于前面的数,将两数位置交换。 #include<iostream>usingnamespacestd;intmain(){ intN,a[1000]; ......
  • 1.8冒泡排序
    1.问题描述把N个整数按照升序排列2.问题分析。利用数组储存,然后相邻数组进行排序。3.代码#include<iostream>#include<string>usingnamespacestd;intmain(){ intn[10]; inti,j; inttemp;  cout<<"请输入十个数字!"<<endl; for(i=0;i<10;i++){ cin>&......
  • 第六周--冒泡排序
    题目描述读入N个整数,利用冒泡排序法对这些数排序,输出排序后的N个数,两个数之间用空格间隔。这里排序指的是升序。输入格式两行,第一行一个正整数N,表示待排序的数的个数。第二行为N个整数。输出格式一行,排序后的N个数。输入输出样例输入 542451输出 124......
  • 冒泡排序
    冒泡排序的个人理解:<!--冒泡排序--><script>vararr=[9,8,7,6,5,4,3,2,1]//定义一个数组for(letj=0;j<arr.length-1/*倒数第二论比较剩下最小值后,不必再进行下一次比较*/;j++){for(leti=0;i<arr.length......
  • 冒泡排序
    自然语言解决问题:冒泡排序通过循环将数组中的数字依次进行排序流程图: 具体代码:#include<stdio.h>#defineN10intmain(){inti,j,a[N],t,count=0;printf("请为数组元素赋初值:\n");for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=1;i<=N-1;i++)......
  • 冒泡排序
    1.问题描述:对N个数字进行冒泡排序;2.问题分析:N个数字可以用数组来进行储存数据,从头开始进行扫描,将目标与相邻的一个进行比较,如果小于则两个数字交换,一轮结束后最小的数字则到最后,第二轮开始时减小便利次数,因为最后一个数字在第一次时已经就是最小的了,遍历N-1次后,则数据会从大到小......
  • day 8 冒泡排序
    1.从第一个数开始循环遍历所有数;2.从前向后比较,若前大于后则进行交换;3.从第二个数开始重新进行上述步骤至结束;4.输出所有数;#include<iostream>usingnamespacestd;intmain(){intn,t;cin>>n;inta[n];for(inti=0;i<n;i++){cin>>a[i];}for(inti=1;i<n;i++){......
  • 冒泡排序
    一问题描述对于键盘输入的N个数进行升序排序二设计思路冒泡排序将第一个数将其与下一个数字比较遇到小的交换数值然后再进行下面二个的比较最后将最大的移动到了最后一位三程序流程图 四伪代码实现先定义输入的个数NintN再然后定义数组将其输入的数存放起来进行for循......