冒泡排序是一种交换排序,它的基本思想是:两两相邻的元素进行比较,如果反序则交换,知道没有反序的元素为止。
#include<stdio.h>
void BubbleSort(int* a, int sz)
{
for (int i = 0; i < sz - 1; i++)//有sz个元素,就要比较sz-1趟
{
for (int j = 0; j < sz - 1 - i; j++)//每一趟里面,都要比较相邻的两个元素,
//也就要比较sz-i-1次
{
if (a[j] > a[j + 1])//排成升序
{
int tep = a[j];
a[j] = a[j + 1];
a[j + 1] = tep;
}
}
}
}
void Print(int* a, int sz)//数组打印函数
{
for (int i = 0; i < sz; i++)
printf("%d ", a[i]);
printf("\n");
}
int main()
{
int a[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(a) / sizeof(a[0]);//求数组元素个数
Print(a, sz);
BubbleSort(a, sz);
Print(a, sz);
return 0;
}
在每一趟排序中,都会把最大的元素放在最后面
因为每一次比较,右边的数都会大于等于左边的数,不断地取大,最右边的数就变成最大的数了;
冒泡排序的优化
为什么需要优化呢?因为如果一个数组是基本有序的,原本的冒泡排序还是要遍历每一次,时间复杂度就很大了,所以在其中增加对于数组是否有序的检查,有序后就可以直接跳出循环了
框出来的部分就是相对于初始的冒泡排序优化的地方,增加了flag来判断数组是否有序,当某一趟下来一次都没有交换时,那么就说明此时数组就已经有序了,不需要继续去排序了,就让它直接跳出循环。
#include<stdio.h>
void BubbleSort(int* a, int sz)
{
for (int i = 0; i < sz - 1; i++)//有sz个元素,就要比较sz-1趟
{
int flag = 0;//假设已经排好序了
for (int j = 0; j < sz - 1 - i; j++)//每一趟里面,都要比较相邻的两个元素,也就要比较sz-i-1次
{
if (a[j] > a[j + 1])//排成升序
{
int tep = a[j];
a[j] = a[j + 1];
a[j + 1] = tep;
flag = 1;
}
}
if (flag == 0)
break;
}
}
void Print(int* a, int sz)
{
for (int i = 0; i < sz; i++)
printf("%d ", a[i]);
printf("\n");
}
int main()
{
int a[10] = { 4,5,6,7,8,9,3,2,1,0 };
int sz = sizeof(a) / sizeof(a[0]);
Print(a, sz);
BubbleSort(a, sz);
Print(a, sz);
return 0;
}