精讲冒泡排序的使用方法


冒泡排序(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; 
}



程序运行结果截图如下:


以上就是本期文章的所有内容啦,希望大家多多点赞。

(完)