程序:
#include<stdio.h>
void bubble_sort(int arr[], int len);
int main(void)
{
int arr[] = { 2,6,4,9,0,1,7,8,5,3 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
void bubble_sort(int arr[], int len)
{
int j = 0;
for (j = 1; j <= len - 1; j++) // j是计算器,有j个数需要比较,总共有len-1个数需要比较,即需要进行len-1趟冒泡排序
{
// 循环内是每一趟冒泡排序的内容
int i = 0;
for (i = 0; i <= len - j - 1; i++) // i是下标,第j个元素参与比较时,下标从0到len-j-1
{
if (arr[i] > arr[i + 1]) // 按升序排列则这里取大于号,按降序排列则这里取小于号
{
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
}
}
结果:
0 1 2 3 4 5 6 7 8 9
分析:
另一个图解分析:
此代码又可以优化的余地。如果某一趟排序两两比较时全部不交换,说明此数组已经拍好序了,不必再进入下面其他趟排序。
优化后的代码:
#include<stdio.h>
void bubble_sort(int arr[], int len);
int main(void)
{
int arr[] = { 2,6,4,9,0,1,7,8,5,3 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
void bubble_sort(int arr[], int len)
{
int j = 0;
for (j = 1; j <= len - 1; j++) // j是计算器,有j个数需要比较,总共有len-1个数需要比较,即需要进行len-1趟冒泡排序
{
// 循环内是每一趟冒泡排序的内容
int flag = 0; // 每一趟排序前让flag等于0
int i = 0;
for (i = 0; i <= len - j - 1; i++) // i是下标,第j个元素参与比较时,下标从0到len-j-1
{
if (arr[i] > arr[i + 1]) // 按升序排列则这里取大于号,按降序排列则这里取小于号
{
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
flag = 1; // flag变成1说明进入了这个if语句,即进行了交换
}
}
if (flag == 0) // 这一趟排序,比较完了后,如果flag还是0,说明没有交换数据,说明此时数组已经排好了
{
break;
}
}
}
示例: