#include <stdio.h>
int count = 0;//定义全局变量,计算冒泡排序次数
//定义冒泡排序函数,两个参数(数组, 数组元素个数)
void bubble_sort(int arr[], int sz)
{
int j = 0;
for (j = 0; j < sz-1; j ++)//趟,一共有sz-1趟
{
int i = 0;
//每一趟内的排序过程
//随着趟的增加,每一趟内需要排序元素个数在减少(sz-1-j)
for (i = 0; i < sz-1-j; i++)
{
int num = 0;
if (arr[i] >= arr [i+1])
{
num = arr[i];
arr[i] = arr[i+1];
arr[i+1] = num;
count++;
}
}
}
}
int main()
{
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int j =0;
//升序排列
int sz = sizeof(arr)/sizeof(arr[0]);
printf("arr[] =");
for (j = 0; j <sz; j++)
{
printf("%d ",arr[j]);
}
printf("\nBubble sorting...\n");
//数组传入函数是,传入的数组首元素的地址
//所以当需要逐一操作每个元素时,应把元素个数也作为参数传入函数
bubble_sort(arr,sz);
printf("arr[] =");
for (j = 0; j <sz; j++)
{
printf("%d ",arr[j]);
}
printf("\nbubble_sort steps = %d \n",count);
return 0;
}
改进版:用Flag判断是否有序,如果在 某一趟 发现已经有序,则不需要进行后面剩余趟的比较,中断循环。
#include <stdio.h>
int count = 0;//观察进行了多少次元素交换
int count1 = 0;//观察进行了多少次比较
void bubble_sort(int arr[], int sz)
{
int j = 0;
for (j = 0; j < sz-1; j ++)
{
int i = 0;
int flag = 1;
//flag值设为1,后面通过判断flag的值是否改变来判断是否break
for (i = 0; i < sz-1-j; i++)
{
int num = 0;
count1++;
if (arr[i] >= arr [i+1])
{
num = arr[i];
arr[i] = arr[i+1];
arr[i+1] = num;
count++;
flag = 0;//尚未完全有序
}
}
if (flag == 1)//如果值没被改变,则说明已经有序,跳出
break;
}
}
int main()
{
int arr[] = {0,1,2,3,9,5,6,7,8,3};
int j =0;
//升序排列
int sz = sizeof(arr)/sizeof(arr[0]);
printf("arr[] =");
for (j = 0; j <sz; j++)
{
printf("%d ",arr[j]);
}
printf("\nBubble sorting...\n");
bubble_sort(arr,sz);
printf("arr[] =");
for (j = 0; j <sz; j++)
{
printf("%d ",arr[j]);
}
printf("\ncompared 【%d】 times in Function bubble_sort\n",count1);
printf("Swap the elements for 【%d】 times to make array order\n",count);
return 0;
}