冒泡排序算法:在一组无序数组中通过循环嵌套。按相邻数组元素每两项互相比较,将两者中最大值通过循环比较传递给下一个数组元素,实现在每一组冒排序中都可以讲该组数据的最大值或者最小值传递给数组的最后一个元素,从而在进行多次冒泡后该无序数列可以按由大到小或者由小到大的方式排列输出。
代码如下
void chanc_a2(int se, int arr[])//降序排列函数
{
int n = 0;
for (n = 0;n < se - 1;n++)
{
int flar = 0;//检索数据是否在第小于最大排列时就已经是有序数组
//优化算法
int j = 0;
for (j = 0;j < se - 1 - n;j++)
{
if (arr[j] <= arr[j + 1])
{
int str = 0;
str = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = str;
flar = 0;
}
}
if (flar == 1)
{
break;
}
}
}
void chanc_a(int se,int arr[])//升序排列函数
{
int n = 0;
for (n = 0;n < se - 1;n++)
{
int flar = 0;
int j = 0;
for (j = 0;j < se - 1-n;j++)
{
if (arr[j] >= arr[j + 1])
{
int str = 0;
str = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = str;
flar = 0;
}
}
if (flar == 1)
{
break;
}
}
}
int main()
{
int i = 0;
int arr[] = { 1,2,9,4,3,6,6,8,4, };
int m = 0;
int se = sizeof(arr) / sizeof(arr[0]);
int f = 0;
scanf_s("%d", &f);
switch (f)//选择以何种方式排列该数组
{
case 1:
chanc_a(se, arr);//升序函数
break;
case 2:
chanc_a2(se, arr);//降序函数
break;
}
for (i = 0;i < se;i++)
{
printf("%d ",arr[i]);
}
}
优化分析:在产生一个数组时,由于默认是将数组进行升序或者降序排列。所以会忽略如果该组数据在输入时已经是有序数组的可能,所以在函数中定义flar变量,当数据经过第一次或者某一次判断后flar的返回值表示他已经是一个有序数列,即可跳出冒泡循环,节省计算量。