冒泡排序是最朴素的排序算法。其过程就像烧水过程一样,大的水泡从壶底一步一步冒出来,直到水面以上。其基本思想是
1. 扫描整个数组,若数组长度为n,第一趟扫描过程中,下标j从0到n-2, 依次比较arr[j] 与 arr[j+1] ,若前者大于后者交换这两个元素。
2. 第一趟扫描完成后,最大的那个元素已经放到数组末尾,所有最后的那个元素已经就位。所以第2次扫描时,只需考虑前n-1个元素,故下标j 从0 到 n-3. 在下面的程序中,在每次扫描时,下标j的最大值为i-1, i是从大到小依次减小的。
3. 如果在某一趟扫描过程中,发现不需交换元素,这说明,数组已经是有序的,不需要做下一趟扫描,可直接退出。
4. 以下是源代码bubble_sort.c,从这篇文章开始,每个算法的源代码都包含排序函数,和一个测试排序函数是否可正确工作的函数
#include <stdio.h>
#include <stdlib.h>
#include "sorts.h"
#define SWAP(a,b) \
{ \
ELE_TYPE t=a; \
a=b; \
b=t; \
}
void bubble_sort(ELE_TYPE arr[], int len)
{
int i, j;
BOOL changed;
for (i=len-1;i>0;i--)
{
changed=FALSE;
for (j=0;j<i;j++)
{
if (arr[j] > arr[j + 1])
{
changed=TRUE;
SWAP(arr[j], arr[j+1])
}
}
if ( !changed)
break;
}
}
void test_bubble_sort()
{
ELE_TYPE arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
int len = (int) sizeof(arr) / sizeof(arr[0]);
printf("original data are:");
print_array(arr, len);
bubble_sort(arr, len);
printf("The data after sorted are:");
print_array(arr, len);
}