思想:每两个数比较大小,大的数和小的数交换位置。直到后面一个数比它大 或者 全都比较完(该数最大)。
count的含义:每次进行比较的时候,count++。哪怕走完一趟冒泡排序,该数组已经变得有序。也需要检验是否有序。
比如说以下代码,只需要把 ‘ 8 ’ 和 ‘ 9 ’ 的位置交换,就已经有序了。但是还需要判断交换完之后,该数组是否有序,所以最后的count是17(9+8),而不是9。
int count = 0; //统计一共需要几次,就能判定该数组是否有序
void maopao(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++) //有n个元素,共需要n-1次冒泡排序的趟数
{
// 小优化 /
int flag = 1;
//每次冒泡完一个数字,flag就置为1。如果有序,那么flag不会变为0。
// 小优化 /
//以下是一趟冒泡排序
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
//以下是一对元素的比较
if (arr[j] > arr[j + 1])
{
//交换
int x = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = x;
flag = 0;
//交换一次,flag置为0。说明该数组还没有有序。
}
count++;
//判断一次,count++
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,9,8 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]); //确定有几个元素---进一步确定需要几趟
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
maopao(arr, sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\ncount = %d\n", count);
return 0;
}
降序只需要把if条件里的 ‘ > ’ 改成 ‘ < ’ 即可。