今天刚学冒泡排序,赶紧来总结和复习,希望对读者也有帮助。
1.冒泡排序
冒泡排序应该是第一个遇到的排序,从动图上来看,冒泡排序是两两相邻之间进行对比的,并且大的数字会往后排,每执行一次排序,最后一个数字已经确定是最大的,所以每次排序长度都会少一个。那么n个数字执行排序,就会执行n-1趟的排序。
根据分析用c语言来执行代码
#include<stdio.h>
int main(){
int arr[15] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}; // 定义一个数组。
int sz = sizeof(arr) / sizeof(arr[0]); // 根据内存来计算数组的长度。
int t ; // 定义一个中间量t,来执行中间的交换
if (sz <2) // 如果数组中就两个元素,那么就直接输出,已经排好了。
{
return;
}
for (int i = sz - 1; i >0; --i) // 定义边界,n个数字,就排n-1趟,--i是每排一趟后面的数字都是排好了就不要需要比较了,所以要--i(i--也可以)。
{
for (int j = 0; j < i; j++)//边界定义好了,就执行中间的详细的过程,两两比较,如果前一个比后一个大,就执行交换。
{
if (arr[j]> arr[j+1])
{
t = arr[j+1]; // 运用中间量t,来执行两两数字间的交换。
arr[j+1] = arr[j];
arr[j] = t;
}
}
}
for (int ok = 0; ok < sz; ok++)//上面的代码已经是排序好了已经是ok了,那么就用循环输出数组的数字。
{
printf("%d ",arr[ok]);
}
return 0 ;
}
结果如图
2.优化
上面的代码是根据图片来写的代码,所以肯定需要进行优化的,我们继续分析,如果给的数组从一开始就已经排好了,那么就不需要n-1趟的排序了,可以直接输出了或者如果在中途整个数组就已经排好了,也可以不需要进行排序了,大大减少了时间了。所以我们考虑在中间加入一个量ifswap,来控制中间的执行过程。
c语言演示
#include<stdio.h>
int main(){
int arr[15] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
int sz = sizeof(arr) / sizeof(arr[0]);
int t ;
int ifswap =0; // 定义一个量,来控制执行过程的排序。
if (sz <2)
{
return;
}
for (int i = sz - 1; i >0; --i)
{
ifswap =0; // 每一趟的排序,都初始化ifswap
for (int j = 0; j < i; j++)
{
if (arr[j]> arr[j+1])
{
t = arr[j+1];
arr[j+1] = arr[j];
arr[j] = t;
ifswap =1; //ifswap 赋值1就说明这一趟的数字没有还是乱的没有排序完。
}
}
if (ifswap ==0)
{
break; // 如果ifswap ==0 说明这一趟数的数组已经完整的排序好了,不需要继续执行比较的过程了,可以直接输出了
}
}
for (int ok = 0; ok < sz; ok++)
{
printf("%d ",arr[ok]);
}
return 0 ;
}
3.python演示
毕竟也是学python的,用python来演示一下
arr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]
n = len(arr)
for i in range(n-1,1,-1):
ifswap =0
for j in range(n-1):
if arr[j]>arr[j+1]:
arr[j],arr[j+1] = arr[j+1],arr[j]
ifswap=1
if ifswap ==0:
break
print(*arr)
4.总结
这是接触第一个排序,后面还九种,我的目标是每个都熟烂于心,并且对以后数据结构与算法的学习有帮助。冒泡排序还可以用递归的写法来执行,在这里就不演示出来了,感兴趣的读者可以动手试试。