目录
一、冒泡排序的思想
假设要求升序,比较相邻的元素。如果第一个比第二个大,则交换。对每一对相邻元素作同样的工作,从开始第一对到结尾到最后一对。这一趟完成后,最后的元素就会是最大的数,然后最后一个元素已经排好,不用再参与排序。接着针对剩下元素重复以上的步骤。
二、过程分析
1)第一趟排序:
第一次排序:5和9比较,满足升序,位置不变 5,9,3,6
第二次排序:9和3比较,不满足升序,位置交换,5,3,9,6
第三次排序:9和6比较,不满足升序,位置交换,5,3,6,9(此时9已经是最大的,无需参与排序)
因此,第一趟总共进行3次排序。
2)第二趟排序:
第一次排序:5和3比较,不满足升序,位置交换, 3,5,6,9
第二次排序:5和6比较,满足升序,位置不变, 3,5,6,7(此时6已经有序,无需参与排序)
因此,第二趟总共进行2次排序。
3)第三趟排序 :
第一次排序:3和5比较,位置不变 3,5,6,7
到目前情况,数组已经为有序的情形了。
因此,第三趟总共进行1次排序。
三、算法分析
假设N个数字要排序,则一共要进行N-1趟排序,每个数字需要排序n - i - 1次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
四、代码实现
#include <stdio.h>
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void bubble_sort(int arr[], int n)
{
//外层循环趟数
for (int i = 0; i < n - 1; i++)
{
// 内层循环每个元素需要的次数
for (int j = 0; j < n - 1 - i; j++)
{
//相邻数字比较
if (arr[j] > arr[j + 1])
{
// 封装Swap函数来交换元素
Swap(&arr[j], &arr[j + 1]);
}
}
}
}
int main()
{
int arr[] = { 2,6,8,7,6,0,1,5,9,3 };
// 计算数组元素个数
int size = sizeof(arr) / sizeof(arr[0]);
// 冒泡排序
bubble_sort(arr, size);
// 输出排序后的元素
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
【程序结果】