冒泡排序的原理:从左到右,两两元素进行比较,每进行一趟冒泡排序就会找到序列中最大的一个或最小的一个,并将其放到了最终应该出现的位置。
以从小到大排序为例,进行完第一趟冒泡排序后,序列中最大的那个元素就会浮到最右边;第二趟进行完后,序列中第二大的元素就会浮到倒数第二的位置,一趟一趟的进行比较交换后,最终实现从小到大的序列。
目录
1、冒泡排序的图解
这里我们就画出了第一趟的冒泡排序,由图可以看出数字9最终浮到了最右边。在进行完冒泡排序后,序列就实现了从小到大的排列,对于上图即 0123456789。
2、冒泡排序的代码
输入十个数据,并用冒泡排序算法实现从小到大的排列。
代码:
#include<stdio.h>
//用冒泡排序,排升序
//n个元素要n-1趟
void bubble_sort(int* p,int n)
{
int i = 0, j = 0;
for (i = 0; i < n-1; i++) //需要的趟数
{
for (j = 0; j < n-1-i ; j++) //每一趟需要比较的对数
{
//交换
if (p[j] > p[j + 1])
{
int temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
int main()
{
int a[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
printf("排序前:");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
bubble_sort(a,10);
//传数组传的是地址
printf("排序后:");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
我们在写冒泡排序代码中的循环部分的时候,要弄清楚冒泡排序总共要进行几趟(n个元素要n-1趟),并且每一趟需要比较的对数(n-1-i,i从0开始)。
3、冒泡排序的优化
优化后的代码如下:
#include<stdio.h>
//用冒泡排序,排升序
//n个元素要n-1趟
void bubble_sort(int* p, int n)
{
int i = 0, j = 0;
for (i = 0; i < n - 1; i++) //需要的趟数
{
//假设每一趟开始前已经有序
int flag = 1;
for (j = 0; j < n - 1 - i; j++) //每一趟需要比较的对数
{
//交换
if (p[j] > p[j + 1])
{
int temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int a[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
printf("排序前:");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
bubble_sort(a,10);
//传数组传的是地址
printf("排序后:");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
优化后的代码与之前有所不同的是函数中定义了 flag ,来检验是否进行了元素的交换。
运行结果: