冒泡排序(bubble sort)是我们在C语言中一种重要的排序方法,这篇文章我们将说明冒泡排序的思想及过程,再以一个案例帮助大家掌握冒泡排序。
一、思想
首先,通常将存放待排序的N个数据的数组r[0]~r[N-1]垂直排列,下标为i的数据被看做重量为r[i]的起泡。根据轻起泡不能在重气泡之下的原则,从上向下(或从下向上)扫描数组r,凡扫描到违反原则的轻气泡,就使其向上“漂浮”。使值较小的元素像气泡一样逐渐“上浮”到数组的顶部,而值较大的元素逐渐“下沉”到数组的底部。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
二、过程
第一轮:从上向下扫描N个元素,先比较第一对相邻的元素(即第一个元素和第二个元素),如果逆序(即第一个元素大于第二个元素)则交换,使小元素向上移动,再比较第二对相邻元素,如果逆序则交换,以此类推,知道比较最后一对相邻元素,经过这样一轮处理,小元素慢慢向上移动,而最大元素被移到了最后的位置上,这也是他最终应该在的位置(最底部),形象的描述为:最大的数像石头一样经过一轮沉到了无序区N个元素的底部,成为有序区的一个元素,下一轮它无须再比较了。
第二轮:对于无序区的N-1个元素,仍然是从第一对相邻元素到最后一对相邻元素依次比较,如果逆序就交换,与第一轮不同的是,少比较了一堆,结果使第二大的元素被移到倒数第二位置上,这也是排序后它的位置,即沉到了无序区N-1个元素的底部。
这样重复N-1轮后,就有N-1元素沉底到对应的位置上,最后无序区剩下一个元素,排序结束。
示例程序:使用冒泡排序法对 7 3 5 9 6 8进行排序
#include<stdio.h>
#define N 6 //数组元素个数为N
void Input(int r[],int n)
{ //输入数组r的n个元素的值
int i;
for(i = 0; i < n; i++)
{
scanf("%d",&r[i]);
}
}
void Output(int r[], int n)
{ //输出数组r的n个元素
int i;
for(i = 0; i < n; i++)
{
printf("%d ",r[i]);
}
printf("\n");
}
void Swap(int *pa , int *pb)
{
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
void BubbleSort(int r[],int n)
{ //用冒泡法对数组r的n个元素进行非递减排序
int i,j,t;
for(i = 1; i < n; i++)
{//控制轮数
for(j = 0; j <= n - 1 - i; j++) //每一轮对无序区元素比较次数
{ //依次比较相邻元素,j为相邻元素前面元素下标
if(r[j] > r[j+1]) //逆序,则交换
{
Swap(&r[j], &r[j+1]);
}
}
}
}
int main()
{
int a[N]; //定义大小为N的数组
printf("输入数组的%d个元素:\n",N);
Input(a,N); //输入数组的N个元素
printf("排序前数组a的元素为:");
Output(a,N); //输出排序前的数组元素的值
BubbleSort(a,N); //冒泡排序
printf("排序后数组a的元素为:");
Output(a,N);
return 0;
}
程序运行结果截图如下:
以上就是本期文章的所有内容啦,希望大家多多点赞。