首先我们分析一下冒泡排序的原理,这里我们以升序为例:
如图所示,有一组数11,22,55,88,11,我们从第一个数开始,拿它和后面一个数进行比较,如果这个数比它后面的数大,那么就把它们俩交换,反之,则不需要交换,然后无论需不需要交换都把手里这个数放下,拿着较大的那个数,然后重复上述步骤,直到遍历至倒数第二个数,那么我们就可以将最大的那个数放在它应该在的位置,这样一轮结束后,继续下一轮,大致步骤与之前没什么区别,只不过,这里我们因为最后一个位置已经确定,它已经是有序的了,所以在遍历的时候就不需要考虑了,如此进行反复的步骤,直到没有能拿来比较的数据,或者在这之前这个数组就已经有序了(也就是不在需要进行任意一次交换了),那么排序就完成了。
代码如下:
#include <stdio.h>
#include <windows.h>
void show(int arr[],int len)
{
int i=0;
for(;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void swap(int* x,int* y)
{
*x^=*y;
*y^=*x;
*x^=*y;
}
void bubble_sort(int arr[],int len)
{
int i=0;
for(;i<len-1;i++)
{
int count=0;
int j=0;
for(;j<len-1-i;j++)
{
if(arr[j]>arr[j+1])
{
count++;
swap(&arr[j],&arr[j+1]);
}
}
if(count==0)
{
break;
}
}
}
int main()
{
int arr[]={11,22,55,88,11};
int len=sizeof(arr)/sizeof(arr[0]);
show(arr,len);
bubble_sort(arr,len);
show(arr,len);
system("pause");
return 0;
}
运行结果如下: