冒泡排序
一、画图理解
二、代码实现
#include<stdio.h>
#include<Windows.h>
void BubbleSort(int *a, int num)
{
int i = 0;
for (i = 0; i < num - 1; i++)//num-1轮
{
int j = 0;
for (j = 0; j <num - 1 - i; j++)//每轮中有num-1-i趟
{
if (a[j] > a[j + 1])//升序,若是想降序,变成<即可
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int k = 0; k < num; k++)
{
printf("%d ", a[k]);
}
printf("\n");
}
int main()
{
int a[] = { 23, 45, 5, 7, 98, 6, 34, 98, 45 };
int num = sizeof(a) / sizeof(a[0]);
BubbleSort(a, num);
system("pause");
return 0;
}
三、代码优化
问题:若是输入的数据是有序的时候,代码也会从头到尾执行一遍,但是这样的话,代码的效率就不高,那么,有没有什么办法可以改变这种现象呢?
原理:给开头定义一个flag=1;
若是数据是有序的,那么程序循环内部的判决条件将不会实现,在循环中给flag赋的值将不会变化,则,在循环外面的条件flag==1成立,直接跳出循环,就实现了优化。
以下,就是优化后的代码。
#include<stdio.h>
#include<Windows.h>
void BubbleSort(int *a, int num)
{
int i = 0;
int flag = 1
for (i = 0; i < num - 1; i++)//num-1轮
{
int j = 0;
for (j = 0; j <num - 1 - i; j++)//每轮中有num-1-i趟
{
if (a[j] > a[j + 1])//升序,若是想降序,变成<即可
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag=0;
}
}
if (flag == 1)
{
break;
}
}
for (int k = 0; k < num; k++)
{
printf("%d ", a[k]);
}
printf("\n");
}
int main()
{
int a[] = { 23, 45, 5, 7, 98, 6, 34, 98, 45 };
int num = sizeof(a) / sizeof(a[0]);
BubbleSort(a, num);
system("pause");
return 0;
}
菜鸟一枚,水平有限,谢众位博友批评指正,不胜感激!
来源:CSDN
作者:兔萌萌
链接:https://blog.csdn.net/qq_41041036/article/details/103671718