冒泡排序
冒泡排序的基本思想:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。
Q:12 35 99 18 76这五个数从大到小排序。
A:越小越靠后,现在第一位是12,先将12和第二位35比较,序列变为35 12 99 18 76,然后12和99比较,序列变为35 99 12 18 76,继续比较,第一趟排序完成时,序列为35 99 18 76 12 。
然后开始第二趟,首先还是第一位和第二位比较,如果第一位比第二位小,交换,然后依次比较第二位和第三位,第三位和第四位,这时已经不需要比较第四位和第五位了,因为第五位已经归位了。
第三趟也是如此,第四趟的时候虽然因为巧合序列已排好,但是换一个序列可能就不成立了,所以还需要第四趟。
总结:如果有n个数进行排序,只需将n-1个数归位,也就是说要进行n-1趟操作。
Code:
#include<stdio.h>
int main()
{
int a[100],i,j,t,n;
scanf("%d",&n); //输入一个数,表示接下来有n个数
for(i=1;i<=n;i++)//循环读入n个数到数组a中
{
scanf("%d",&a[i]);
}
//冒泡排序的核心部分
for(i=1;i<=n-1;i++)//n个数排序,只能进行n-1趟
{
for(j=1;j<=n-1;j++)//从第一位开始比较直到最后一个尚未归位的数
{
if(a[j]<a[j+1])//比较大小并交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=1;i<=n;i++)//输出结果
{
printf("%d",a[i]);
}
return 0;
}
核心:双重嵌套循环
时间复杂度:O(N^2) 非常高的时间复杂度
解决上一个桶排序无法解决的问题,只需运用结构体,而解决时间复杂度的问题则需要快排。