实现规则为:首先制定排序规则,然后,依次两两比较待排序的数据,若不符合排序规则,则进行交换,然后依次比较下去,直到全部元素排列有序为止。
示例1:有如下一组数据{85,279,948,521,616,888},按照从大到小的顺序排列,使用冒泡排序,首先执行第一趟交换,过程如图所示。
![](https://images.cnblogs.com/cnblogs_com/hanjun/%E5%9B%BE%E7%89%871.jpg)
经过五趟数据比较与交换后,数据顺序变为由大到小的有序序列。从而实现了使用冒泡排序的目的。其一般表达函数为:
void BubbleSort(dataList r[], int n)
{
int loop1, loop2, temp;
for(loop1=1;loop1<=n-1;loop1++) //外层循环,控制循环比较趟数
{
for(loop2=n;loop2>=loop1+1;loop2--) //内层循环,控制比较位置
{
if(r[loop2] < r[loop2-1]) //判断是否符合交换规则
{
temp=r[loop2];
r[loop2]=r[loop2-1];
r[loop2-1]=temp;
}
}
}
}
示例2:
# include <stdio.h>
void sort(int * a, int len)
{
int i, j, t;
for (i=0; i<len-1; i++)
{
for (j=0; j<len-1-i; j++)
{
if (a[j] > a[j+1]) //>表示升序 <表示降序
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main(void)
{
int a[6] = {10, 3, 7, 5, 11,-1};
int i = 0;
sort(a, 6);
for (i=0; i<6; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void sort(int * a, int len)
{
int i, j, t;
for (i=0; i<len-1; i++)
{
for (j=0; j<len-1-i; j++)
{
if (a[j] > a[j+1]) //>表示升序 <表示降序
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main(void)
{
int a[6] = {10, 3, 7, 5, 11,-1};
int i = 0;
sort(a, 6);
for (i=0; i<6; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
示例3:给输入的10个数字进行排序,将他们以从小到大的顺序输出到屏幕上
方法一:
#include <stdio.h>
main()
{
int a[10];
int i, j, t;
printf("输出10个数字:\n");
for(i=0; i<9; i++)
{
scanf("%d",&a[i]);
}
printf("\n");
//冒泡排序法
for(j=0;j<=9;j++)
{
for(i=0;i<=9-j;i++)
{
if(a[i] > a[i+1])
{
t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
}
}
printf("输出排序后的数字:\n");
for(i=1; i<=9; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
方法二:
# include <stdio.h>
//冒泡排序
void sort(int * a, int len)
{
int i, j, t;
for (i=0; i<len-1; i++)
{
for (j=0; j<len-1-i; j++)
{
if (a[j] > a[j+1]) //>表示升序 <表示降序
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main(void)
{
int a[10];
int i=0;
int j;
printf("输入10个数字:\n");
for(j=0; j<=9; j++)
{
scanf("%d", &a[j]);
}
printf("\n");
//排序
sort(a, 10);
//打印出排完序的数字,遍历
for (i=0; i<=9; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
#include <stdio.h>
main()
{
int a[10];
int i, j, t;
printf("输出10个数字:\n");
for(i=0; i<9; i++)
{
scanf("%d",&a[i]);
}
printf("\n");
//冒泡排序法
for(j=0;j<=9;j++)
{
for(i=0;i<=9-j;i++)
{
if(a[i] > a[i+1])
{
t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
}
}
printf("输出排序后的数字:\n");
for(i=1; i<=9; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
方法二:
# include <stdio.h>
//冒泡排序
void sort(int * a, int len)
{
int i, j, t;
for (i=0; i<len-1; i++)
{
for (j=0; j<len-1-i; j++)
{
if (a[j] > a[j+1]) //>表示升序 <表示降序
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
int main(void)
{
int a[10];
int i=0;
int j;
printf("输入10个数字:\n");
for(j=0; j<=9; j++)
{
scanf("%d", &a[j]);
}
printf("\n");
//排序
sort(a, 10);
//打印出排完序的数字,遍历
for (i=0; i<=9; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
优劣:冒泡排序的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),
但是有两个优点:
1.“编程复杂度”很低,很容易写出代码;
2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。