冒泡排序是最简单的排序方法,它的计算次数多,不是最快的,但它是最基本的排序方法。
假设有一个整型数组:2,4,9,1,6,3,5,8,10,7; 要求把它们按从小到大的顺序依此排列。它的实现过程如下:
第一轮比较:从数组第一个元素到数组最后一个元素,相邻的两个元素的值进行比较,数组下标小的数的值大于数组下标大的元素的值时,便交换它们的值。如此下来,最大的值便被放到数组最后一个元素上。总共比较9次。
第一轮比较后的数组: 2,4,1,6,3,5,8,7,9,10
第二轮比较::重复上述步骤,相邻两个元素进行比较,但是这时比较的次数只有八次,因为已经确定最大的值是最后一个,所以无需进行比较。这样,第二大的数就排在数组倒数第二个元素上。
第二轮比较后的数组:2,1,4,3,5,6,7,8,9,10
第三轮比较::同样的,比较过后第三大的数排在倒数第三个元素上。
第三轮比较后的数组:1,2,3,4,5,6,7,8,9,10
可以看到经过三轮比较过后数组已经是满足题目要求的了,但是程序还是会继续进行下一轮比较,直到进行完第九轮(数组长度-1)比较后才停止比较。因此冒泡排序法是比较低效的,当数组原本就是有序时尤为明显。
…
最后一轮比较后的数组:1,2,3,4,5,6,7,8,9,10
冒泡排序法具体实现如下:
#include <stdio.h>
int main()
{
int data[10] = {2,4,9,1,6,3,5,8,10,7};
int tmp;
int i, j;
for (i=0; i<sizeof(data)/sizeof(int)-1; i++) //外层循环,次数为数组长度减1
{
for (j=0; j<sizeof(data)/sizeof(int)-1-i; j++) //内层循环,次数为数组长度减外层循环次数再减一
{
if (data[j] > data[j+1]) //如果数组下标为j的元素的值大于数组下标为j+1的元素的值
{
tmp = data[j+1]; //把数组下标为j+1的元素的值存放在tmp中
data[j+1] = data[j]; //把数组下标为j的元素的值赋给j+1
data[j] = tmp; //原来数组下标为j+1的元素的值赋给j
}
}
}
for (i=0; i<sizeof(data)/sizeof(int); i++)
{
printf("%d ", data[i]);
}
printf("\n");
return 0;
}