c语言中冒泡排序的实现原理是什么?

作者&投稿:督面 (若有异议请与网页底部的电邮联系)
C语言冒泡排序。~

#include
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]);
}

扩展资料:冒泡排序算法的运作
1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。
简单的表示
#include

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
", a[i]);
}
return 0;
}
参考资料来源:冒泡排序-百度百科

for(i=0;i<N;i++)//起什么作用
{
for(j=0;j<N-i-1;j++)// 不明白N-i-1的原理
if(a[j]<a[j+1])//起什么作用
{
//是怎么交换2个值的?
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
这是冒泡的核心,感觉写法跟java差不多,不过这样写不太直观。

首先第一句是从第一个数起比较

N-i-1指的是每循环一轮,最大的数自然在最后。所以每次都要减i
而减1是因为它后面有一个当前数和后面的数对比。

if(a[j]<a[j+1])
指的是如果后面的数比前面的数大。则返回真,执行下面的语句。
否则不执行。

temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
如果后面的数大,那么就执行。具体的逻辑。
想将A和B的值互换,那么。
temp = A
A=B
B=temp
如果直接A=B,A原来的值就会不见了。

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,
j的值依次为1,2,...10-i

冒泡排序,就是对一组数进行逐趟排序的方法,具体分为升序和降序。
以升序为例。
每一趟的任务,就是从一组数的第一个数开始,依次比较相邻的两个数的大小。既然是升序,那么比较后,如果前者大于后者,那么两者交换位置。就这样依次地比下去。
这样的话,第一趟就把最大的数排到了最后。
而每再比较一趟的时候,都排除已经生成的结果,比如第二趟,不会再比较最后一个数(它已经是最大的了,当然如果比较也没问题,浪费时间而已);第三趟,不会再比较最后两个数。。。
每一趟都把最大的数排到当前范围的末尾。
这样循环下去,每一趟都会把当前范围内最大的数扔到后面去。排序就完成了。
------------------------------------------------------------------------------------------------------------------------------
举个升序排序的例子:
对于{
10,5,3,11,9
}这组数,
第一趟,10与5比较,10
比5大,所以互换位置(5,10,3,11,9),10和3比较,10>3,所以互换位置(5,3,10,11,9),10与11比较,不用互换位置;11与9比较,互换位置(5,3,10,9,11),第一趟结束;
第二趟,由于11已经是最大的,那么只剩下{5,3,10,9};5>3,所以互换位置(3,5,10,9);5<10,不用互换位置;10>9,互换位置(3,5,9,10),第二趟结束。
第三趟,只剩下{3,5,9},3<5,不用互换位置;5<9,不用互换位置,第三趟结束。
第四趟,只剩下{3,5},3<5,不用互换位置,第四趟结束。
此时由于只剩两个数,本趟已经把两个数较大的一个放到了第二的位置,所以循环到此结束。
结果就是{3,5,9,10,11}。
过程中,每一趟都会把相邻的两个数中较大的换到后面,即每趟中,最大的数都会被置换到最后,就像一个气泡浮出水面一样,越来越大,到出水时就是最大的。所以才叫冒泡排序。

选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。
冒泡排序:
冒泡排序(bubblesort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

C语言冒泡排序法代码
答:冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较就,选出最大的数;经过第2轮比较,就选出次大的数,以此类推。下面以对 3 2 4 1 进行冒泡排序说明。1.这个算法用rand函数产生新的要排序的数据,与已有的有序数列中的数据依次比较,如果遇到比他大的数据...

c语言实现冒泡排序法
答:1、开启一个终端并打开vim,新建文件bubble.c。输入预处理指令#includestdio.h,用于调用printf函数 2、定义一个排序函数void sort(int *a, int n)。其中a表示待排序的数组的首地址;n表示待排序数组的长度。3、使用两层循环实现冒泡排序。其中外层控制循环的轮次;内层控制一次循环的比较位置。当相邻...

C语言冒泡排序法
答:冒泡排序每一趟排序把最大的放在最右边。比如:87 12 56 45 78 87和12交换:12 87 56 45 78 87和56交换: 56 87 45 78 87和45交换: 45 87 78 87和78交换: 78 87 到此第一趟排序结束,接下来的每一趟排序都是这样。include<stdio.h>void Print(int *num, int n){ int...

c语言 使用冒泡排序将一维数组A中的N个元素升序排列
答:方法和详细的操作步骤如下:1、第一步,打开C文件,定义一组序列和要排序的各种变量,然后处理排序逻辑,具体的代码见下图,转到下面的步骤。2、第二步,完成上述步骤后,冒泡排序的逻辑是一组数字从第一个值开始,如果两个相邻数字的顺序与期望的顺序不同,则会交换两个数字的位置。 重复此过程,直到...

C语言冒泡排序法
答:grade[j+1]=grade[j]; //将比较小的数赋值给数组中后面的变量 grade[j]=temp; //将比较大的数赋值给数组中前面的变量 } //从此便完成大小变量的交换,使得大值往前放 } //结束内层循环 } //结外内层循环,完成排序 printf("最后排序为:\n");//在屏幕显式“最后排序为:”并换行 for(i...

用C语言编程:输入5个数,按从小到大顺序输出!?
答:有不懂的可以问我:#include <stdio.h>int main (){ int a[5];int i,j,temp;printf("input 5 number:\n");for(i=0;i<5;i++) scanf("%d",&a[i]);//获取输入的5个整数,分别放在数组成员a[0]到a[4]中 for(i=5;i>0;i--)//冒泡排序 for(j=0;ja[j+1]){ temp=a[...

C语言冒泡排序法代码是什么?
答:所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法。1、具体方法是,相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则...

C语言冒泡排序法的详细注释?
答:起泡排序法的基本思想是:对于一个待排序的序列(假设按升序排序),从左向右依次比较相邻的两个数,如果左边的数大,则交换两个数以使右边的数大。这样比较、交换到最后,数列的最后一个数则是最大的。然后在对剩余的序列进行相同的操作。这个操作过程被称为一次起泡。一次起泡的操作只能使数列的最右...

在C语言中,冒泡排序是怎样做的?如题 谢谢了
答: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++) ...

C语言链表如何实现冒泡排序?
答:两种 思路:1、交换链表中各节点的数据,不交换节点;2、交换节点,即节点link指针的内容。下面以第一种思路为例:void sort(LinkList L){ int i,j,t;LinkList p = L;int count = 0;while(p->link != NULL){ count++;p = p->link;} for(i=0;i<count-1;i++)/ 冒泡法排序 / { ...