冒泡排序的思想:相邻两个数据两两比较(假如我们要排升序),前一个数据大于后一个数据就两两交换,有n个数据就比较n-1躺,每一趟会确定一个数到正确的位置,第一趟比较n-1次,第二趟比较n-2次……第n-1躺比较1次。
假如有这么一组数据 “5 7 6 8 2 1 3 9 4”,我们想要排升序,我们可以这样排,先排第一趟。
第一趟排完之后你会发现最大的数字排到最后的位置了,也就是说一趟冒泡排序可以确定一个数据到正确的位置;
代码如下:
#include <stdio.h>
void BubbleSort(int* arr, int len)
{
int i = 0; //i控制趟数
int j = 0; //j控制每一趟比较的次数
for(i = 1; i < len; i++)
{
for(j = 0; j < len-i; j++)//第一趟比较n-1次,之后每一躺比上一躺少比较一次
{ //因为每一趟比较完成之后,会最终确定一个数字。
if(arr[j] > arr[j+1])//前一个大于后一个就交换
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main()
{
int arr[9] = {5,7,6,8,2,1,3,9,4};
BubbleSort(arr,9);
int i = 0;
for(i = 0; i < 9; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
冒泡排序的优化:
冒泡排序的思想是相邻的两个数比较,符合交换条件就交换,如果在某躺比较中一次交换都没有发生,是不是意味着数据已经排好了?那后面的趟数是不是就可以不走了?是的!!!由此,我们可以优化一下冒泡排序。
void BubbleSort(int* arr, int len)
{
int i = 0; //i控制趟数
int j = 0; //j控制每一趟比较的次数
for(i = 1; i < len; i++)
{
int flag = 0;
for(j = 0; j < len-i; j++)//第一趟比较n-1次,之后每一躺比上一躺少比较一次
{ //因为每一趟比较完成之后,会最终确定一个数字。
if(arr[j] > arr[j+1])//前一个大于后一个就交换
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1;
}
}
if(flag == 0) //如果一次交换都没有发生,flag依旧是0,意味着数据已经拍好了
break;
}
}