冒泡排序
冒泡排序(Bubble Sort,或称:泡沫排序、气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
基本概念
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。这样就完成了第一趟冒泡排序,结果是将序列中最大的元素放在了序列的最后面;因此,第二趟冒泡排序就不用考虑最后的一个数据,因为它已经是此序列中最大的元素了。
第二趟冒泡排序仍然从第1个元素开始,比较方法与第一趟一样,到倒数第2个元素结束。
如此重复,直至某一趟排序中没有任何数据交换为止,即完成了排序工作。
排序过程中是无法知道有没有数据交换的,因此,我们需要一个标志,记录某一趟冒泡排序时,数据交换次数(或有没有交换)。
C语言示例
示例中array为数组指针,first为排序起始编号,last为排序结束编号,bubble_soft函数完成从first开始,到last结束区间内的数据的排序。
示例中有两种实现方法,第一种严格按照基本概念完成冒泡排序,第二种在第一种的基础上略加优化,将某一趟冒泡排序最后一次交换数据的位置设置为下一趟冒泡排序的终止位置,在大多数情况下,可以减少循环次数。
#include <stdio.h>
void print_array(int *array, int length)
{
int i = 0;
while(i < length)
printf("%d ", array[i++]);
printf("\n");
}
#if 1
void bubble_sort(int *array,unsigned int first,unsigned int last)
{
unsigned int i = 0, k = 0, sign = 1;
int temp;
while(sign)
{
sign = 0;//标志清零
for( i = first; i < last - k; i++)
{
if(array[i] > array[i + 1])
{
temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;//数据交换
sign++;
}
}
k++;//下一趟可以少判断一个
}
}
#else
void bubble_sort(int *array,unsigned int first,unsigned int last)
{
unsigned int i = 0, j = first, k = 0, sign = 1;
int temp;
while(sign)
{
sign = 0;//标记清零
k = last;
for( i = first; i < k; i++)
{
if(array[i] > array[i + 1])
{
temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;//数据交换
sign++;
j = i + 1;//记录最后一次交换的位置,表示从此处到最后的序列是有序的
}
}
k = j;//设置下一趟冒泡排序的结束位置
}
}
#endif
int main(void)
{
int array[10] = {4,1,7,8,5,3,9,5,6,3};
printf("before bubble_sort: ");
print_array(array,10);
bubble_sort(array, 0, 9);
printf(" after bubble_sort: ");
print_array(array,10);
getchar();
return 0;
}
程序运行结果如下: