基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序为止。
对于有n个元素的序列,最坏情况是要冒n-1趟,每趟选出一个最大的元素放在序列的末尾, 或最小的元素放在序列的头部,剩下的元素再次冒泡。
#include <stdio.h>
void swarp(int array1[], int i, int j)
{
int temp = array1[i];
array1[i] = array1[j];
array1[j] = temp;
}
//每次找出最大的一个元素放在后面排列
void bubblesort(int array1[], int length)
{
int i = 0;
int j = 0;
int exchanged = 1; //优化代码,当不在发生交换时,说明整个序列已经是按顺序排列了,不需要再继续了
for(i=0; i < length && exchanged; i++)
{
for(j=1; j < length-i; j++)
{
if(array1[j-1] > array1[j])
{
swarp(array1, j-1, j);
}
}
}
}
//每次找出最小的一个元素放在前面排列
void bubblesort1(int array1[], int length)
{
int i = 0;
int j = 0;
int exchanged = 1;
for(i=0; i < length && exchanged; i++)
{
exchanged = 0;
for(j= length-1; j > i; j--)
{
if(array1[j] < array1[j-1])
{
exchanged = 1;
swarp(array1, j, j-1);
}
}
}
printf("i = %d\n", i);
}
int main()
{
int i = 0;
int array1[] = {1, 2, 3, 4, 5};
int length = sizeof(array1) / sizeof(array1[0]);
bubblesort1(array1, length);
for(i=0; i < length; i++)
{
printf("%d\n", array1[i]);
}
return 0;
}
这是实现了两中冒泡方式,一种是每次冒泡选出最大的元素(下沉),一种是每次冒泡是选出最小的元素(上浮),后者语义更符合冒泡的含义。
这里进行了优化,使用变量exchanged记录每趟冒泡是否有交换,如果某趟没有发生交换,则说明序列已经排好序了,没有必要再进行下去了,否则每次都要执行n-1趟。