排序(五):冒泡排序
原创
©著作权归作者所有:来自51CTO博客作者TheOneGIS的原创作品,请联系作者获取转载授权,否则将追究法律责任
利用交换数据元素的位置进行排序的方法称为交换排序。常用的交换排序方法有冒泡排序法和快速排序法。快速排序法是一种分区交换排序方法。
冒泡排序的基本概念是:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。第一趟完成,最大的数被放置在最后。
重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。
如此下去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
因为冒泡排序比较简单,所以直接给出示例程序:
//冒泡排序
void bubbleSort(int data[], int n)
{
int flag = 0;
//总共比较n-1趟
for (int i = 1; i < n && flag == 0; i++)
{
//flag用于判断本次交换排序过程是否有交换动作,若本次交换排序过程没有交换动作,则说明数据元素已经全部排列好,就可以提前结束排序过程。
flag = 1;
for (int j = 0; j < n - i; j++)
{
if (data[j + 1] < data[j])
{
flag = 0;
swap(&data[j], &data[j + 1]);
}
}
}
}
//交换两个元素
void swap(int *numx, int *numy)
{
int temp;
temp = *numx;
*numx = *numy;
*numy = temp;
}