目录
什么是冒泡排序?
冒泡排序的算法思想
算法图解
参考代码
运行结果
优化代码
运行结果
什么是冒泡排序?
将两个相邻的元素进行比较,如果前面的元素大(从小到大排序),就交换两个元素,重复这样往后依次操作,最终的结果是将一个数列按从大小或则从小到大的顺序排列;
冒泡排序的算法思想
1.先把第一个和第二个元素进行比较,如果大小顺序与目的顺序不同,就进行交换;
2.第一次比较后,把第二个和第三元素进行比较,如果与目的顺序不同,再进行交换;
3.重复上述操作,将这个数列遍历完一边后,最大或则最小的数(取决于你想排的顺序)就被放在了最后;
4.像这样,每遍历完一遍,就会将一个元素放在正确位置,所以我们遍历的次数等于所需要排列的元素个数减去一(即如果我们想要将10个数排序,就需要遍历9次);
算法图解
参考代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Print(int arr[],int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int arr[] = { 2,7,1,10,8,9,6,4,3,5 };
int len = sizeof(arr)/sizeof(arr[0]);
int i = 0;
int j = 0;
for (i = 0; i < len-1; i++)
{
for (j = 0; j < len-i-1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j +1]; //元素的交换
arr[j + 1] = tmp;
}
}
Print(arr,len); //打印函数,打印排序过程
printf("\n");
}
return 0;
}
运行结果
代码优化
如果数列本是有序的,就不需要排序了。
优化代码
void Print(int arr[], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9 };
int len = sizeof(arr) / sizeof(arr[0]);
int i = 0;
int j = 0;
int flag = 1; //标记
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0; //如果一次遍历数组中有一次交换,说明数组无序
int tmp = arr[j]; //将flag赋值变为0;若有序则不变
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (flag == 1) //若flag没改变,说明数组有序
{
break; //跳出循环
}
Print(arr, len);
printf("\n");
}
Print(arr,len);
return 0;
}
运行结果
(应为一次)