冒泡法规律
A. “冒泡排序法”是什么
冒泡排序详细注释:
/* 用冒泡排序法对一维整型数组中的十个数升序排序 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,t,a[10];
printf("Please input 10 integers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++) /* 冒泡法排序 */
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{t=a[j];/* 交换a[i]和a[j] */
a[j]=a[j+1];
a[j+1]=t;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}
其中i=0时:
j从0开始a[0],a[1]比较大小,把其中的较大者给a[1],然后j++,a[1]和a[2]再比较,再把两者中的
较大者给a[2],这样a[0],a[1],a[2]中的最大者已经交换到a[2]中,这个过程继续,直到j=10-i-1=9这样
a[9]中的为10个数中的最大数。
然后i=1时:
由于最大数已找到并放到a[9]中,所以这一次循环j最大只需到10-i-1=8,即a[8]即可,再次从j=0开始a[j]和a[j+1]两两比较交换,最后次大数放到a[8]中
然后i++,继续...
当i=9时已经过9次两两比较完成所有排序,i<9不再成立退出比较。
对于n个数,只需要进行n-1次外循环的两两比较就完成排序。
至于按降序排列只需将if(a[j]>a[j+1])改为if(a[j]<a[j+1])即可。
-------------------------------------------------------------------
/* 用改进型冒泡排序法对一维整型数组中的十个数升序排序 */
#include <stdio.h>
#include <stdlib.h>
int main()
{int i,j,t,a[10],flag;
printf("Please input 10 integers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++) /* 改进型冒泡法排序 */
{ flag=0;
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{ t=a[j]; /* 交换a[i]和a[j] */
a[j]=a[j+1];
a[j+1]=t;
flag=1;
}
if(flag==0)break;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}
这个和上面的实质一样,只是加了一个标志flag,当在一次大循环(即外层循环)内,在内层循环中如果 没有发生一次交换,那么就表示a[0]<a[1]<a[2]<a[3]<a[4]<a[5]<a[6]<a[7]<a[8]<a[9],即数组已经排序完成,此时直接退出循环,不用再比较了。
B. 用c语言编写:输入20个整数,分别用选择法和冒泡法实现降序排列后,再按照每行5个数的规律输出
/////冒泡法
#include <stdio.h>
void main ()
{
int i,a[100],n,j,k=1,t;
printf ("输入个数n: ");//你要的是20,就输入10吧
scanf ("%d",&n);
printf ("输入%d个数据:\n",n);
for (i=0;i<n;i++)
{
printf ("a[%d]= ",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++)
{
printf ("%2d ",a[i]);
if (k%5==0)
printf ("\n");
k++;
}
printf ("\n");
}
//////选择法
#include <stdio.h>
void main()
{
int min,t,i,j,k=1,n,a[100];
printf ("输入个数n: ");//你要的是10,就输入10吧
scanf ("%d",&n);
printf ("输入%d个数据:\n",n);
for (i=0;i<n;i++)
{
printf ("a[%d]= ",i);
scanf ("%d",&a[i]);
}
for(i=0;i<n-1;i++)//选择排序
{
min=i;
for(j=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
if(i!=min)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
printf ("排好序的数据为:\n");
for (i=0;i<n;i++)
{
printf ("%2d ",a[i]);
if (k%5==0)
printf ("\n");
k++;
}
printf ("\n");
}
C. 冒泡笑傲江湖有期货的规律是什么!!!高手告诉下!!!!!!!!
玉米风压涨流就压跌!!!压涨豆麦花风压跌豆麦花流的就压涨~~~!!丝银黄风就压涨流行就压跌钻风压涨流行就压跌~~~~一般的时候都按这规律压~~要么按这规律反着压!!有时候一小时会改一次规律!!!或半小时改次规律!!!我用这规律赢过几万点货期就不太准就不说了~~~~~~`` 我一区的~
D. 线性表里的冒泡排序和快速排序是什么比较次数有什么区别
冒泡排序是一种交换排序方式。设有n个数据依次放在数组元素a(1)至a(n)中,用冒泡法对这n个数据进行递增排序的过程为:先比较a(1)与a(2),若逆序则交换之,接着比较a(2)与a(3),若逆序就交换……依次进行,知道将a(n-1)与a(n)比较交换完,才算完成了第一轮比较交换。然后以同样规则进行第二次交换……一直到数据排好序为止。最坏情形下比较1/2 n(n-1)次,交换3/2 n(n-1)次。
快速排序是由著名计算机学家C.A.R.Hoare在起泡排序的基础上提出的一种高效率的排序算法。它的基本思想是:在待排序数列中选取一个元素(通常是第一个元素)x,按某一规律经过多次交换位置后,它移到某一位置,以此位置对原数列进行划分,使得得到的两个子数列对x来说符合排序规律。元素x称为此数列中的划分元素。接着按此方法对两个字数列再划分,直到得到不需要进一步划分的子数列为止。这一过程具有明显的递归性。
快速排序多数情况下比冒泡排序要高效,若需要算法或代码可以hi本人。
E. 冒泡算法的改进
冒泡排序过程
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮"(交换位置),如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
性能分析
若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。
冒泡排序实现
根据扫描方向不同,实现略有不同。
普通冒泡算法
一般的冒泡排序的第i趟处理是从r[0]到r[n-i],依次比较相邻两个记录的关键字,并在反序时交换相邻的记录,其结果是将这n-i+1个记录中关键字最大的元素交换到第n-i+1的位置上。整个排序过程需要进行n-1趟处理。
冒泡算法的改进:
改进1:增加1个标志位,记录是否发生交换
我们在传统的冒泡排序的基础上增加一个标志位exchange用来表示在一次冒泡排序中,数组的顺序是否发生改变,如果改变了,意味着数组可能还未排列好,所以要进行下一次冒泡排序,而如果exchange的值不为真,也就是说明该数组在本次冒泡排序中,数组的顺序没有发生改变,即数组已经有序,则排序结束。
改进2:记录发生交换的最后位置
我们在改进1的基础上将标志位记录的信息修改为一次冒泡排序中最后一次交换数据的位置,这样进行洗一次冒泡排序的时候,我们可以知道,在这个标志位记录的位置后面的数据均已有序,也就不用考虑了,这样就不用考虑改进1中exchange改变了之后,数组是否已经排好的情况了。
改进3:增加2个记录位,双向记录发生交换的最后位置
我们在改进2的基础上设想,很多数组是有一定的规律性的,如果我们考虑到很多数组自身存在的一些有序性的话,会使问题简化很多,所以我们考虑,不仅仅可以设置单项的记录位扫描,可以设置正反向双向扫描,这样需要增加2个记录位,分别记录上一次冒泡排序中正向和反向发生交换的最后位置,这样就类似于从两侧开始向中间排序,最小的,次小的……从左边开始排,最大的,次大的……从右边开始排,大大提高了效率。
F. 什么是冒泡程序啊
用来排序的,通过相邻两个数的比较,把大数或者小数冒到第一位,然后再冒次大或次小数。
G. py冒泡法排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。
以上是网络词条对冒泡排序的官方解释。
但是我要说一下我的个人理解,我觉得冒泡排序的核心思想是:每次比较两个数,如果他们顺序错误(大于或者小于),那么就把他们置换。
例如:如果要将五个无序的数字做升序排列(也就是从小到大排列),那么利用冒泡排序如何实现呢?
首先,比较第一个数和第二个数的大小,由于是从小到大排列,所以如果第一个数大于第二个数,则将这两个数互换位置,反之则不变。
然后进行第二个数和第三个数比较,同上。
这样依次比较一轮后,你会发现,总共比了4次,也就是说,如果有n个数进行比较,那么需要n-1次才能完成。
上面过程主要完成了一轮比较,最终确定了一个最大的数,并且排在5个数的最后,也就是第五个数。
那么也就意味着需要在进行第一个数到第四个数的一轮比较,确定最大值。
接着从第一个数到第三个数......
这样规律就很明显了,五个数需要比较四轮,就能将5个数升序排列,所以n个数需要比较n-1轮。
以上就是冒泡排序的实现思路,接下来看代码!
如何实现?
到底该怎么实现呢?看了上面的分析,我相信你也能编出来吧!
print(list)
算法的优劣主要看它的时间复杂度,冒泡排序的时间复杂度为:O(N^2)
可以看出,冒泡排序的时间复杂度偏高,所以它还不是最优算法!
H. 冒泡排序稳定吗
据我所知,冒泡的排序,并不是很稳定,因为冒泡是无规律的。
I. 跪求!!定义数组冒泡法排序!!!!!内祥~!
不知道你需要什么语言编写的,我这是用的C#编写的一个控制台程序,与其他语言也只是语法不同,希望对你有帮助
static void Main(string[] args)
{
string str = Console.ReadLine();
string[] strs = str.Split(',');
int[] nums = new int[strs.Length];//这里是按用户自己输入的方式,如果你是需要定义11的数组可以修改为不让用户输入
for (int i = 0; i < nums.Length; i++)
{
nums[i] = int.Parse(strs[i]);
}
nums = Sorting(nums);//调用冒泡排序方法
for (int i = (nums.Length - 1); i >= 0; i--)
{
Console.WriteLine(nums[i]);
}
Console.ReadKey();
}
///冒泡排序法(降序排序)
public static int[] Sorting(int[] nums)
{
int[] sizes = new int[nums.Length];
for (int i = 0; i < nums.Length; i++)
{
int size = 0;
for (int j = 0; j < nums.Length - i - 1; j++)
{
if (nums[j] > nums[j + 1])
{
size = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = size;
}
else
{
size = nums[j + 1];
}
}
if (i == nums.Length - 1)
{
size = nums[0];
}
sizes[i] = size;
}
return sizes;
}
J. 先采用冒泡法,将学生成绩 从高到低进行排序,再输入一个学生的成绩,将此成绩按照排序规律插入已排好序的
建立成绩单,可以两次输入成绩,学生总人数最大30人,成绩按从大到小排列。下面是程序:
#include<stdio.h>
#definemax_NUM30
voidbubble_sort(inta[],intn)
{
inti=0,j=0,temp=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
voidinsert_sort(inta[],intn,intn1)//n为总人数,n1为设定从第n1个元素开始插入
{
inti=0,j=0,k=0,m=0,temp=0;
k=n1;
for(i=k;i<n;i++)
{
temp=a[i];
for(j=0;j<k-1;j++)
{
if(a[j]<temp)
{
break;
}
}
for(m=n1-1;m>=j;m--)
{
a[m+1]=a[m];
}
a[j]=temp;
k++;
}
}
voidmain()
{
intscore[max_NUM]={0};
inti=0,n1=0,n2=0;//n1为第一次输入成绩个数,n2为后补充输入成绩个数
printf("请输入学生人数 ");
scanf("%d",&n1);
printf("输入成绩 ");
for(i=0;i<n1;i++)
{
scanf("%d",&score[i]);
}
bubble_sort(score,n1);
printf("请输入后添加学生的人数 ");
scanf("%d",&n2);
if(n1+n2>max_NUM)
{
printf("人数太多 ");
return;
}
else
{
printf("请输入成绩 ");
for(i=n1;i<n1+n2;i++)
{
scanf("%d",&score[i]);
}
}
insert_sort(score,(n1+n2),n1);
printf("总人数成绩清单,成绩从高到低: ");
for(i=0;i<(n1+n2);i++)
{
printf("%d ",score[i]);
}
}
程序运行结果: