问题:使用冒泡排序的方法,将数组中的元素按照升序的方式将其排列。
冒泡排序核心思想:两两相邻元素进行比较,满足条件则交换;
① 先确认趟数;
② 写下一趟冒泡排序的过程;
③ 最后进行交换;
#include<stdio.h>
void bubble_sort(int arr[],int sz) //这里不需要返回,所以不选择int
{
int i=0;
for(i=0;i<sz-1;i++) //计算出冒泡排序的趟数
{
int j=0;
for(j=0;j<sz-i-1;j++) //计算出每一趟所要比较的对数
{
if(arr[j]>arr[j+1]) //if语句在这里实现的是交换值的大小
{
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
}
}
int main()
{
int i=0;
int arr[]={1,2,3,4,5,6,7,8,9};
int sz=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz); //函数传参,传过去的是arr数组首元素的地址
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
以上代码 ,不难看出,当数组中的元素无序时,此方法较为合理。当元素有序时,此方法是不是有点繁琐呢?
因此代码可进行优化,如下:
只需将函数声明部分做一下修改;
void bubble_sort(int arr[],int sz)
{
int i=0;
int flag=1;//假设这一趟排序的数组已经有序
for(i=0;i<sz-1;i++)
{
int j=0;
for(j=0;j<sz-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
flag=0;//本趟排序的数据其实不完全有序
}
}
if(flag==1)
break;
}
}