冒泡排序可以对一组数据进行从小到大或者从大到小进行排序
下面对数据从小到大的冒泡排序进行介绍:
图示:
小的数值在左面,大的数值在右面,就像水中冒泡一样,越来越大。
以4个数值5,3,6,2进行排序为例介绍
进行第一次排序
首先将第一个数值与第二个数值进行比较,第一个数值为5,第二个数值为3,5>3,将5与3的位置交换,此时为3,5,6,2。然后进行第二个数值与第三个数值进行比较,此时第二个数值为5,第三个数值为6, 5<6,所以位置不用交换,此时为3,5,6,2.最后进行第三个数值与第四个数值的比较,第三个数值为6,第四个数值为2, 6>2,所以讲6和2的位置交换,此时为3,5,2,6。所以第一次排序找出了这组数据的最大值6。第一次排序结果:
进行第二次排序:
首先将第一个数值与第二个数值进行比较,第一个数值为3,第二个数值为5,3<5,所以不进行位置交换。此时为3,5,2,6。进行第二个数值为第三个数值进行比较,第二个数值为5,第二个数值为2, 5>2,所以进行位置交换。此时为3,2,5,6。因为6已确定是最大值,所以5与6不用进行比较,5可以确定为次最大值。第二次排序结果:
进行第三次排序:
将第一个数值与第二个数值进行比较,第一个数值为3,第二个数值为2,3>2,所以进行位置交换,此时为2,3,5,6。3与5不用进行比较,因为5已经被确定为次最大值。所以第三次排序结果为:
总结:1 若有n个数值,需要n-1次排序。此例中有4个数值,进行了3次排序。
2 在第m次排序中,需要进行n-m次数值比较。例如此例中第一个排序需要进行4-1=3次数值比较。
下面为冒泡排序的程序,随机产生20个数值,然后对其20个数值进行排序。
#include <stdio.h>
#include <time.h>
//冒泡排序
void BubbleSort(int *pData, int count)
{
int temp, i, j;
for(i = 0; i < count-1; i++) //需要进行排序的次数
{
for(j = 0; j < count-1-i; j++) //每次排序需要进行比较的次数
{
if(pData[j] > pData[j+1]) //进行数值交换
{
temp = pData[j];
pData[j] = pData[j+1];
pData[j+1] = temp;
}
}
}
}
int main()
{
time_t timep;
srand((int)time(&timep));
int i;
int Data[20] = {0};
for(i = 0; i < 20; i++)
{
Data[i] = rand()%100+1;
}
BubbleSort(Data, 20); //调用函数进行排序
for(i = 0; i < 20; i++) //打印排序好的数字
{
printf("%d ", Data[i]);
}
printf("\n");
return 0;
}
运行结果: