冒泡排序:通过将数组中相邻的两个元素进行两两比较,从而达成升序或降序重新排列数组内元素的方法。
从图中可以看出:(升序排列)
1、相邻两个数字每次比较后,根据情况进行调换位置,这样可以逐渐把最大数字排到数组的尾端;
2、可以的出规律数组中元素的个数x,与进行比较的总轮数a以及每轮次数b的关系。
比较的总轮数a=x-1; 第n轮比较的次数b=x-1-i;(一般定义i=0,每循环一次i++)
例如:图中有6个元素,总共需要比较6-1=5轮, 第3轮需要比较的次数为:6-1-2(i从0开始算,第3轮的时候i=2)=3次.
口诀:
X个数字来排队,两两比较小靠前。
外层循环X-1(控制需要比较的轮数)。
内层循环X-1-i(控制每轮需要比较的次数)。
示例:
#include <stdio.h> void main{ int nums[5]; //假设数组内有5个元素 int i,j,k,temp; //设置几个变量 for(i=0;i<5;i++){ printf("请输入第%d个元素:",i+1); scanf("%d",&nums[i]); //获取用户输入的元素,并将其保存到数组中 } //对数组中元素进行排序 //外层循环控制需要比较的轮数:每轮比较结束后可以确定一个最大的。 for(j=0;j<4;j++){ //内层循环控制每轮需要比较的次数,次数为数组内元素个数-1,所以该循环需要4次 for(k=0;k<4-j;k++){ //两两进行比较,如果前边元素大于后边的元素,需要交换位置 if(nums[k]>nums[k+1]){ //此处>号控制数组是升序还是降序 temp = nums[k]; nums[k]=nums[k+1]; nums[k+1]=temp; } } } printf("排序后:\n"); for(i=0;i<5;i++){ printf("%d\t",nums[i]); } }
效果图:
如果要更改排序方式,只需更改 if(nums[k]>nums[k+1]) 中的比较符号即可。
将代码进行简单的升级:
#include <stdio.h> void main (){ int i,j,k,m,x,temp; printf("请输入要进行排序的数字的个数:\n"); scanf("%d",&x); int num[x]; for(i=0;i<x;i++){ printf("请输入第%d个元素:",i+1); scanf("%d",&num[i]); }
for(j=0;j<x-1;j++){ for(k=0;k<x-1-j;k++){ if(num[k]<num[k+1]){ temp=num[k+1]; num[k+1]=num[k]; num[k]=temp; } } } printf( "数组num中的元素为:\n"); for(m=0;m<x;m++){ printf("%d\t",num[m]); } printf("\n"); }
效果图: